Synchronisieren schreibt und liest mit dem Jet OLE DB-Provider und ADO

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 200300 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Zusammenfassung

Alle ADO-Verbindung mit Jet OLE DB-Provider verwaltet eine unabhängige Jet-Sitzung. Dies führt zu einer Verzögerung zwischen Schreibvorgänge auf eine Verbindung gelesenen für eine zweite Verbindung, auch wenn Sie zwei Verbindungen in derselben Datenbankanwendung haben.

Dieses asynchronen Schreiben/Lesen Verhalten ist beabsichtigt. Microsoft Jet verwendet eine Seite Pufferung System um verbesserte Leistung bereitzustellen und diese Seite System Pufferung kann nicht deaktiviert.

Zu Jet des verzögerten Schreiben/Lesen Verhalten demonstrieren, wenn unabhängige ADO-Verbindungen verwenden, führen Sie den folgenden Code von einer Schaltfläche in einem einfachen VB-Formular:

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
				
Beachten Sie, dass wenn Sie den oben stehenden Beispielcode immer wieder ausführen, Sie zeitweise 10 erhalten werden, zeichnet zurückgegebenen oder 0 Datensätze zurückgegeben, wenn das USE_SAME_CONNECTION-Flag auf False festgelegt ist. Dies veranschaulicht wird, schreibt und liest, Verwendung von zwei ADO-Verbindungen mit Jet OLE DB-Provider 4.0 nicht vollständig synchron sind. Wenn Sie das USE_SAME_CONNECTION-Flag auf True festlegen, erhalten Sie immer 10 Datensätze zurückgegeben. Dies veranschaulicht, schreibt und liest auf demselben ADO-Verbindung sind 100 % synchron, wenn Jet OLEDB-Provider 4.0 verwenden.

Weitere Informationen

In bestimmten Situationen müssen Sie zwei separate ADO-Verbindungen verwenden, wenn schreiben und Lesen von Daten aus einer Access-Datenbank über den Jet OLEDB-Provider. Z. B. Wenn Sie zwei separate Prozesse, die beim Schreiben und mit der gleichen Access-Datenbank lesen verfügen, besteht keine Möglichkeit eine einzelne Verbindung freigeben. In diesem Fall Sie können synchronisieren schreibt und liest mit separaten ADO-Verbindungen Wenn Sie diese Richtlinien:

  1. Der Writer muss eine Transaktion gestartet werden mithilfe von ADO des Connection.BeginTrans , vor, die Daten zu schreiben.
  2. Der Writer muss die Datenbankaktualisierungen stellen und dann einen commit die Transaktion (unter Verwendung des ADO- Connection.CommitTrans ).
  3. Der Leser muss JRO.JetEngine.RefreshCache in der Verbindung zum Lesen der Daten bevor übergeben aufrufen.
Beachten Sie, dass JRO.JetEngine enthalten ist, indem Sie einen Verweis auf die Microsoft Jet And Replication Objects 2.1 Library VB-Projekt hinzufügen.

Das folgende Codebeispiel veranschaulicht die zwei Verbindungen mithilfe der oben beschriebenen Methode synchronisieren:

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
				
Wenn Sie den oben stehenden Code ausführen, sollten Sie immer 10 Datensätze zurückgegeben von der Verbindung Reader erhalten. Wenn Sie den Aufruf von RefreshCache kommentieren oder verwenden Sie die Transaktion nicht, wenn die Daten zu schreiben, wird die Anzahl der zurückgegebenen Datensätze nicht immer 10 sein. Diese Methode folgende lässt synchronisierte schreibt und liest zwischen separaten Prozessen sowie beim Verwenden von ADO mit Microsoft Jet OLE DB Provider 4.0.

Beachten Sie, dass diese Methode bei den Microsoft Access-ODBC-Treiber mit ADO nicht funktioniert. Microsoft Access ODBC-Treiber ist nicht synchronisiert schreibt und liest zwischen zwei kontinuierlich geöffnete ADO-Verbindungen unter allen Umständen zulässig. Um erfolgreich zu schreiben und Lesen von Daten mithilfe von Microsoft Access ODBC-Treiber mit ADO, muss die Writer-Verbindung geschlossen werden, nachdem das Schreiben abgeschlossen ist und die Leser-Verbindung geschlossen und vor zum Lesen der Daten geöffnet werden muss. Verwenden Sie die folgende Methode zum Synchronisieren schreibt und liest zwischen 2 Verbindungen mit Microsoft Access ODBC-Treiber und ADO:

  1. Der Writer muss stellen die Datenbankaktualisierungen (mit oder ohne Transaktion) und schließen Sie die Verbindung.
  2. Der Reader schließen und öffnen es Verbindung vor dem Versuch, die Daten zu lesen.

Informationsquellen

180223Gewusst wie Synchronisierung Lese- und Schreibvorgänge zwischen zwei DAO-Prozesse

Eigenschaften

Artikel-ID: 200300 - Geändert am: Dienstag, 13. Juli 2004 - Version: 1.1
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft OLE DB Provider for Jet 4.0
Keywords: 
kbmt kbdatabase kbhowto kbjet kbprovider KB200300 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 200300
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
Disclaimer zu nicht mehr gepflegten KB-Inhalten
Dieser Artikel wurde für Produkte verfasst, für die Microsoft keinen Support mehr anbietet. Der Artikel wird deshalb in der vorliegenden Form bereitgestellt und nicht mehr weiter aktualisiert.

Ihr Feedback an uns