ID do artigo: 200300 - Última revisão: terça-feira, 13 de julho de 2004 - Revisão: 1.1

Como sincronizar gravações e leituras com o provedor do Jet OLE DB e ADO

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Expandir tudo | Recolher tudo

Sumário

Cada conexão ADO que usa o Jet OLE DB Provider mantém uma sessão de Jet independente. Isso resulta em um atraso entre gravações em uma conexão que está sendo lido em uma segunda conexão, mesmo se você tiver duas conexões no mesmo aplicativo de banco de dados.

Esse comportamento leitura/gravação assíncrona é por design. Microsoft Jet usa uma página de buffer de sistema para fornecer desempenho de banco de dados avançada e esta página buffer sistema não pode ser desativada.

Para demonstrar o comportamento de leitura gravação atrasada do Jet quando usando conexões de ADO independentes, execute o código a seguir partir de um botão em um formulário simples do VB:

Const USE_SAME_CONNECTION = False

Sub MissedReadsDemo()
Dim conn1 As New ADODB.Connection
Dim conn2 As New ADODB.Connection
Dim rs As New ADODB.recordset
Dim strConnect As String
Dim i As Long

    ' Set up our connection string (requires a database named c:\db1.mdb).
    strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\db1.mdb"

    ' Open connection 1 and drop and re-create test table.
    conn1.CursorLocation = adUseServer
    conn1.Open strConnect
    On Error Resume Next
    conn1.Execute "drop table tmpTest", , _
        adExecuteNoRecords + adCmdText
    On Error GoTo 0
    conn1.Execute "create table tmpTest (id long)", , _
        adExecuteNoRecords + adCmdText
    
    ' Close connection 1 to flush the creation of table tmpTest. 
    conn1.Close
    
    ' Now open connection 1 and connection 2.
    conn1.Open strConnect
    conn2.Open strConnect
    
    ' Insert 10 records using connection 1.
    For i = 1 To 10
        conn1.Execute "insert into tmpTest (id) values (1)", , _
            adExecuteNoRecords + adCmdText
    Next i
    
    ' Attempt to read records using second connection if
    ' USE_SAME_CONNECTION is set to False.
    If (USE_SAME_CONNECTION) Then
        Set rs = conn1.Execute("select * from tmpTest", , adCmdText)
    Else
        Set rs = conn2.Execute("select * from tmpTest", , adCmdText)
    End If
    
    ' Count records in our table (should be 10).
    i = 0
    While Not rs.EOF
        i = i + 1
        rs.MoveNext
    Wend
    rs.Close

    If (USE_SAME_CONNECTION) Then
        MsgBox "Read " & i & " records using same connection."
    Else
        MsgBox "Read " & i & " records using 2 different connections."
    End If
    
    conn1.Close
    conn2.Close

End Sub
				
Observe que se você executar o código de exemplo acima repetidamente, você intermitentemente obterá 10 registros retornados ou 0 registros retornados quando o sinalizador USE_SAME_CONNECTION é definido como False. Isso demonstra que grava e lê ao usar o ADO duas conexões com o provedor de OLEDB do Jet 4.0 não são completamente síncronos. Se você definir o sinalizador USE_SAME_CONNECTION como True, você sempre verá 10 registros retornados. Isso demonstra que grava e lê no mesmo conexão ADO são 100 % síncrona ao usar o provedor de OLEDB do Jet 4.0.

Mais Informações

Em determinadas situações, talvez seja necessário usar duas conexões ADO separadas quando gravar e ler dados de um banco de dados Access usando o Jet OLE DB Provider. Por exemplo, se você tiver dois processos separados que estão escrevendo e leitura para o mesmo banco de dados do Access, não há nenhuma maneira de compartilhar uma única conexão. Nessa situação, você pode sincronizar gravações e leituras com conexões de ADO separadas se você seguir estas diretrizes:

  1. O gravador deve iniciar uma transação usando Connection.BeginTrans , antes para gravar os dados do ADO.
  2. O gravador deve fazer as atualizações de banco de dados e, em seguida, confirmar a transação (usando Connection.CommitTrans do ADO ).
  3. O leitor deve chamar JRO.JetEngine.RefreshCache passando em sua conexão antes de tentar ler os dados.
Observe que é incluída JRO.JetEngine adicionando uma referência ao Microsoft Jet And Replication Objects 2.1 Library ao seu projeto do VB.

O exemplo de código a seguir demonstra como sincronizar duas conexões usando o método acima:

Sub SyncReadDemo()
Dim conn1 As New ADODB.Connection
Dim conn2 As New ADODB.Connection
Dim rs As New ADODB.recordset
Dim JRO As New JRO.JetEngine
Dim strConnect As String
Dim i As Long

    ' Set up our connection string (requires a database named c:\db1.mdb).
    strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\db1.mdb"

    ' Open connection 1 and drop and re-create test table.
    conn1.CursorLocation = adUseServer
    conn1.Open strConnect
    On Error Resume Next
    conn1.Execute "drop table tmpTest", , _
        adExecuteNoRecords + adCmdText
    On Error GoTo 0
    conn1.Execute "create table tmpTest (id long)", , _
        adExecuteNoRecords + adCmdText
    
    ' Close connection 1 to flush the creation of table tmpTest. 
    conn1.Close
    
    ' Now open connection 1 and connection 2.
    conn1.Open strConnect
    conn2.Open strConnect
    
    ' Insert 10 records using connection 1.
    ' Note we must perform all writes inside of a transaction.
    conn1.BeginTrans
    For i = 1 To 10
        conn1.Execute "insert into tmpTest (id) values (1)", , _
            adExecuteNoRecords + adCmdText
    Next i
    conn1.CommitTrans
    
    ' Refresh cache for reader connection.
    JRO.RefreshCache conn2
    Set rs = conn2.Execute("select * from tmpTest", , adCmdText)
    
    ' Count records in our table (should be 10).
    i = 0
    While Not rs.EOF
        i = i + 1
        rs.MoveNext
    Wend
    rs.Close

    MsgBox "Read " & i & " records using different connections."
    
    conn1.Close
    conn2.Close

End Sub
				
Se você executar o código acima, você sempre deve obter 10 registros retornados pela conexão de leitor. Se você comentar a chamada para RefreshCache , ou não usar a transação ao gravar os dados, o número de registros retornados não sempre será 10. Após esse método permitirá que sincronizados gravações e leituras entre processos separados bem ao usar o ADO com o Microsoft Jet OLE DB Provider 4.0.

Observe que esse método não funciona usando o driver ODBC do Microsoft Access com o ADO. O driver ODBC do Microsoft Access não permite sincronizadas gravações e leituras entre duas conexões ADO continuamente abertas em qualquer circunstância. Em ordem para gravar e ler dados usando o driver ODBC do Microsoft Access com o ADO com êxito, a conexão de gravador deve ser fechada após a gravação completa e a conexão de leitor deve ser fechada e reaberta antes para ler os dados. Use o método seguinte para sincronizar grava e lê entre 2 conexões com o driver ODBC do Microsoft Access e ADO:

  1. O gravador deve fazer as atualizações de banco de dados (com ou sem uma transação) e feche sua conexão.
  2. O leitor feche e reabra é conexão antes para tentar ler os dados.

Referências

180223  (http://support.microsoft.com/kb/180223/EN-US/ ) Como sincronizar leituras e gravações entre dois processos DAO

A informação contida neste artigo aplica-se a:
  • Microsoft OLE DB Provider for Jet 4.0
Palavras-chave: 
kbmt kbdatabase kbhowto kbjet kbprovider KB200300 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 200300  (http://support.microsoft.com/kb/200300/en-us/ )
Retired KB ArticleAviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.