Artigo: 200300 - Última revisão: terça-feira, 13 de Julho de 2004 - Revisão: 1.1

Como sincronizar as escritas e leituras com o fornecedor de OLE DB Jet e o 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 | Reduzir tudo

Sumário

Cada ligação ADO que utiliza o fornecedor de OLE DB Jet mantém uma sessão de Jet independente. Isto provoca um atraso entre escritas numa ligação a ser lido por uma segunda ligação, mesmo se tiver duas ligações na mesma aplicação de base de dados.

Este comportamento de escrita/leitura assíncrona é por predefinição. Microsoft Jet utiliza uma página de memória intermédia de sistema para fornecer o desempenho da base de dados avançada e esta página de memória intermédia de sistema não pode ser desactivada.

Para demonstrar o comportamento de leitura/escrita adiada do Jet quando utilizar ligações ADO independentes, execute o seguinte código a partir de um botão num formulário VB simples:

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
				
Nota que se executa repetidamente o código de exemplo acima, intermitentemente obterá 10 registos devolvidos ou 0 registos devolvidos quando o sinalizador USE_SAME_CONNECTION estiver definido como FALSE. Demonstra que escreve e lê quando utilizar duas ligações ADO com o fornecedor de OLEDB do Jet 4.0 não são completamente síncronas. Se definir o sinalizador USE_SAME_CONNECTION como TRUE, sempre obterá 10 registos devolvidos. Demonstra que escreve e lê na mesma ligação ADO são síncronas 100 % quando utiliza o fornecedor de OLEDB do Jet 4.0.

Mais Informação

Em determinadas situações poderá ser necessário utilizar duas ligações ADO separadas quando escrever e ler os dados de uma base de dados Access utilizando o fornecedor de OLEDB do Jet. Por exemplo, se tiver dois processos separados de escrita e leitura para a mesma base de dados do Access, não existe nenhum método para partilhar uma única ligação. Nesta situação, pode sincronizar escritas e leituras com ligações ADO separadas se seguir estas directrizes:

  1. O escritor deve iniciar uma transacção, através Connection.BeginTrans , antes para escrever os dados do ADO.
  2. O escritor tem de efectuar actualizações da base de dados e, em seguida, consolidar a transacção (utilizando Connection.CommitTrans do ADO ).
  3. O leitor tem de chamar JRO.JetEngine.RefreshCache passar na respectiva ligação antes de tentar ler os dados.
Tenha em atenção que JRO.JetEngine está incluído por adicionar uma referência para o Microsoft Jet E Replication Objects 2.1 Library ao projecto de VB.

O exemplo de código seguinte demonstra como sincronizar duas ligações utilizando 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 executar o código anterior, deve sempre obter 10 registos devolvidos pela ligação do leitor. Se comentar a chamada para RefreshCache ou não utilizar a transacção ao escrever os dados, o número de registos devolvidos não será sempre 10. Este método a seguir permitirá sincronizadas escritas e leituras entre vários processos separados quando utilizar o ADO com o Microsoft Jet OLE DB Provider 4.0.

Note que este método não funciona quando utilizar o controlador de ODBC do Microsoft Access com o ADO. O controlador ODBC do Microsoft Access não permite sincronizadas escritas e leituras entre duas ligações ADO continuamente abertas em qualquer circunstância. Para escrever e ler dados a utilizar o controlador de ODBC do Microsoft Access com o ADO com êxito, a ligação de escritor têm de ser fechada depois da escrita está concluída e a ligação do leitor tem de ser fechada e reaberta antes para ler os dados. Utilize o seguinte método para sincronizar escreve e lê entre 2 ligações com o controlador de ODBC do Microsoft Access e o ADO:

  1. O escritor deve efectuar as actualizações da base de dados (com ou sem uma transacção) e feche de ligação.
  2. O leitor tem de fechar e reabrir a respectiva ligação antes a tentar ler os dados.

Referências

180223  (http://support.microsoft.com/kb/180223/EN-US/ ) Como sincronizar leituras e escritas 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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 ArticleExclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.