How To Synchronize Writes and Reads with the Jet OLE DB Provider and ADO (200300)
The information in this article applies to:
- Microsoft OLE DB Provider for Jet 4.0
This article was previously published under Q200300 SUMMARY
Every ADO connection that uses the Jet OLE DB Provider maintains an independent Jet session. This results in a delay between writes on one connection being read on a second connection, even if you have two connections in the same database application.
This asynchronous write/read behavior is by design. Microsoft Jet uses a page buffering system to provide enhanced database performance and this page buffering system cannot be turned off.
To demonstrate Jet's delayed write/read behavior when using independent ADO connections, run the following code from a button in a simple VB form:
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
Note that if you run the above sample code over and over, you will intermittently get 10 records returned or 0 records returned when the USE_SAME_CONNECTION flag is set to False. This demonstrates that writes and reads when using two ADO connections with the Jet OLEDB Provider 4.0 are not completely synchronous. If you set the USE_SAME_CONNECTION flag to True, you will always get 10 records returned. This demonstrates that writes and reads on the same ADO connection are 100% synchronous when using the Jet OLEDB Provider 4.0.
REFERENCES180223 How To Synchronizing Reads and Writes Between Two DAO Processes
Modification Type: | Minor | Last Reviewed: | 7/13/2004 |
---|
Keywords: | kbDatabase kbhowto kbJET kbProvider KB200300 |
---|
|