Makale numarası: 200300 - Son Gözden Geçirme: 13 Temmuz 2004 Salı - Gözden geçirme: 1.1

Eşitleme nasıl yazar ve ADO ve Jet OLE DB sağlayıcısı ile okur.

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.
Hepsini aç | Hepsini kapa

Özet

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.

Daha fazla bilgi

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.:

  1. Yazıcı bir hareket, ADO'NUN Connection.BeginTrans verileri yazmak için önce kullanarak başlatmanız gerekir.
  2. Yazıcı, veritabanı güncelleştirmeleri ve sonra (ADO'NUN Connection.CommitTrans kullanarak) hareketin tamamlanması gerekir.
  3. 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:

  1. Yazıcı (olan veya olmayan bir işlem) veritabanı güncelleştirmeleri ve kendi bağlantıyı kapatın.
  2. Okuyucu kapatın ve verileri okumaya çalışması için önce bu bilgisayarın bağlantısı'nı yeniden açın.

Referanslar

180223  (http://support.microsoft.com/kb/180223/EN-US/ ) Eşitleme okuma ve yazma iki DAO işlemler arasında nasıl

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft OLE DB Provider for Jet 4.0
Anahtar Kelimeler: 
kbmt kbdatabase kbhowto kbjet kbprovider KB200300 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:200300  (http://support.microsoft.com/kb/200300/en-us/ )
Retired KB ArticleKullanım Dışı Bilgi Bankası İçeriği Yasal Uyarı
Bu makale, Microsoft'un artık destek sağlamadığı ürünler ile ilgili olarak yazılmıştır. Bu nedenle, bu makale "olduğu gibi" sağlanmıştır ve bundan sonra güncelleştirilmeyecektir.