Jet OLE DB Sağlayıcısı'nı kullanan her ADO bağlantısı bağımsız bir Jet oturumu korur. Bu ikinci bir bağlantıda bile aynı veritabanını uygulamada iki bağlantınız okunan bir bağlantıda yazma işlemleri arasında bir gecikme olur.
Bu zaman uyumsuz yazma veya okuma davranış tasarım gereğidir. Gelişmiş veritabanı performans sağlamak için Microsoft Jet sistem arabelleği sayfa kullanır ve bu sayfayı, sistem ara belleğe alma devre dışı bırakılamaz.
Bağımsız bir ADO bağlantısı kullanırken Jet'ın Gecikmeli yazma veya okuma davranışını göstermek için <a0></a0>, basit bir VB) form içindeki bir düğmeyi aşağıdaki kodu çalıştırın:
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
Yukarıdaki örnek kod tekrar tekrar çalıştırırsanız, zaman zaman 10 elde edersiniz, Not bayrağı USE_SAME_CONNECTION false olarak ayarlandığında döndürülen döndürülen ya da 0 kayıtları. Bu, Jet OLEDB Sağlayıcısı 4.0 iki ADO bağlantı tümüyle eşzamanlı olmayan kullanırken okur ve yazar da gösterir. USE_SAME_CONNECTION bayrak TRUE olarak ayarlarsanız, her zaman 10 kayıt geri elde edersiniz. Bu aynı okur ve yazar gösterir ADO bağlantısı Jet OLEDB Sağlayıcısı 4.0 kullanırken % 100 zaman uyumlu olur.
Belirli durumlarda, yazma ve Jet OLEDB Sağlayıcısı kullanan bir Access veritabanından veri okunuyor iki ayrı ADO bağlantısı kullanmanız gerekir. Örneğin, yazma ve aynı Access veritabanına okuma, iki ayrı işlemler varsa, tek bir bağlantıda paylaşmak için bir yolu yoktur. Bu durumda, yazma eşitleyebilir ve izlerseniz, bu yönergeleri ayrı bir ADO bağlantı okur.:
- Yazıcı bir hareket, ADO'NUN Connection.BeginTrans verileri yazmak için önce kullanarak başlatmanız gerekir.
- Yazıcı, veritabanı güncelleştirmeleri ve sonra (ADO'NUN Connection.CommitTrans kullanarak) hareketin tamamlanması gerekir.
- Okuyucu için veri okuma girişimi öncesinde kendi bağlantıda geçirmeden JRO.JetEngine.RefreshCache çağırmalısınız.
VB projeniz için bir başvuru bir
Microsoft Jet And Replication Objects 2.1 kitaplığı ekleyerek
JRO.JetEngine bulunduğunu unutmayın.
Aşağıdaki kod örneği, yukarıdaki yöntemi kullanarak, iki bağlantı eşitlemeye gösterilmiştir:
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
Yukarıdaki kod çalıştırırsanız, her zaman 10 kayıt Okuyucu bağlantısı tarafından döndürülen almalısınız.
RefreshCache çağrısı aç?klama veya verileri yazarken hareket kullanma, döndürülen kayıtların sayısını her zaman 10 olur. Bu yöntemi uygulayarak eşitlenen yazma ve okuma ayrı işlemler arasında en Microsoft Jet OLE DB Provider 4.0 ile ADO kullanarak izin verir.
Bu yöntem, Microsoft Access ODBC sürücüsü, ADO ile kullanırken kullanılamaz olduğunu unutmayın. Microsoft Access ODBC sürücüsü eşitlenen yazar ve okumalar arasında iki sürekli açık ADO bağlantı durumunda tüm üreticiye güvendiğinizi doğrulamak zorunda altında izin vermiyor. Başarıyla yazmak ve Microsoft Access ODBC sürücüsü ile ADO kullanarak verileri okumak için yazıcı bağlantısı ve Okuyucu bağlantısı kapatıldı olmalı ve veri okumak için önce re-opened yazma işlemi tamamlandıktan sonra kapatılmalıdır. Eşitlemek için aşağıdaki yöntemi kullanın, yazar ve ADO Microsoft Access ODBC sürücüsüyle 2 bağlantıları arasında okur:
- Yazıcı (olan veya olmayan bir işlem) veritabanı güncelleştirmeleri ve kendi bağlantıyı kapatın.
- Okuyucu kapatın ve verileri okumaya çalışması için önce bu bilgisayarın bağlantısı'nı yeniden açın.
180223
(http://support.microsoft.com/kb/180223/EN-US/
)
Eşitleme okuma ve yazma iki DAO işlemler arasında nasıl