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.
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:
Der Writer muss eine Transaktion gestartet werden mithilfe von ADO des Connection.BeginTrans , vor, die Daten zu schreiben.
Der Writer muss die Datenbankaktualisierungen stellen und dann einen commit die Transaktion (unter Verwendung des ADO- Connection.CommitTrans ).
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:
Der Writer muss stellen die Datenbankaktualisierungen (mit oder ohne Transaktion) und schließen Sie die Verbindung.
Der Reader schließen und öffnen es Verbindung vor dem Versuch, die Daten zu lesen.
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
(http://support.microsoft.com/kb/200300/en-us/
)
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.
Hat dieser Artikel bei der Lösung Ihres Problems geholfen?
Ja
Nein
Ich weiß nicht
Waren die Informationen für Ihr Problem relevant?
Ja
Nein
Wie könnte man den Artikelinhalt verbessern?
Hinweis: Leider können wir keine Kommentare persönlich beantworten.
Danke! Dieses Feedback hilft uns dabei, die Supportartikel weiter zu verbessern. Weitere Informationen finden Sie auf der Hilfe und Support-Startseite.