使ACCESS數(shù)據(jù)庫(kù)保持同步

2010-08-28 10:44:50來(lái)源:西部e網(wǎng)作者:

  同步(Synchronization)是數(shù)據(jù)庫(kù)在網(wǎng)絡(luò)環(huán)境中應(yīng)用所要涉及到的一個(gè)重要概念。其基本過(guò)程大致分以下幾個(gè)步驟:首先把一個(gè)數(shù)據(jù)庫(kù)設(shè)為可復(fù)制副本屬性,使其成為設(shè)計(jì)正本(VB中稱設(shè)計(jì)原版,ACCESS中稱設(shè)計(jì)母版);然后根據(jù)應(yīng)用程序的實(shí)現(xiàn)需要從設(shè)計(jì)正本復(fù)制出多個(gè)副本(VB中稱復(fù)本),這些副本組成一個(gè)副本集合(設(shè)計(jì)正本也被看做是第一個(gè)的、初始的副本);最后在集中任何復(fù)本的數(shù)據(jù)或結(jié)構(gòu)被更改會(huì)時(shí)啟用同步機(jī)制把改變發(fā)送并且應(yīng)用于此復(fù)本集中的其他成員,使得副本集中的成員在數(shù)據(jù)或結(jié)構(gòu)上保持一致性。實(shí)現(xiàn)同步的這一過(guò)程被稱為同步化。VB6.0為實(shí)現(xiàn)同步,在數(shù)據(jù)庫(kù)對(duì)象中提供了多個(gè)屬性與方法來(lái)實(shí)現(xiàn)這一過(guò)程,以下介紹主要的幾個(gè)屬性與方法,分別對(duì)應(yīng)同步化的幾個(gè)步驟:

  1.Replicable屬性:

  Replicable屬性用來(lái)使一個(gè)數(shù)據(jù)庫(kù)對(duì)象或數(shù)據(jù)庫(kù)中的表對(duì)象、查詢對(duì)象等對(duì)象成為可復(fù)制副本的,即成為設(shè)計(jì)正本。但數(shù)據(jù)庫(kù)對(duì)象并不提供Replicable這一屬性,因此首先要用CreatePropety方法來(lái)創(chuàng)建它,然后把它添加到對(duì)象的屬性集中,最后再給它賦值,使數(shù)據(jù)庫(kù)成為設(shè)計(jì)正本。對(duì)于數(shù)據(jù)庫(kù)對(duì)象而言,把Replicable屬性設(shè)置為“T”將使數(shù)據(jù)庫(kù)對(duì)象成為可復(fù)制的。以下代碼將使VB6.0安裝目錄下附帶的Nwind.mdb數(shù)據(jù)庫(kù)成為一個(gè)設(shè)計(jì)正本(為確保安全建議在操作前備份這一庫(kù)文件):


   Private Sub Command1_Click()
  Dim dbNwind As Database
  '如果末引用DAO則一定要先引用
  Dim prpNew As Property
  Set dbNwind = OpenDatabase("Nwind.mdb", True)
  With dbNwind
  '建立Replicable屬性,如果已經(jīng)存在該屬性則程序略過(guò)這一步
  On Error Resume Next
  Set prpNew = .CreateProperty("Replicable", dbText, "T")
  .Properties.Append prpNew
  '設(shè)置數(shù)據(jù)庫(kù)的Replicable屬性為True
  .Properties("Replicable") = "T"
  .Close
  End With
  End Sub
 

  2.MakeReplica方法:

  MakeReplica方法從設(shè)計(jì)正本復(fù)制出一個(gè)新的完全副本。其語(yǔ)法為:database.MakeReplica replica, description, options,其中replica是代表一個(gè)新副本路徑名稱的字符串;description是對(duì)正在創(chuàng)建的新副本的一個(gè)描述字符串;options是一個(gè)可選項(xiàng),可以是dbRepMakePartial常量(創(chuàng)建一個(gè)部分副本)或dbRepMakeReadOnly常量(防止用戶修改新副本中的可復(fù)制對(duì)象),如果要建立的是一個(gè)只讀式的部分副本,則要加入?yún)?shù)常量 dbRepMakeReadOnly + dbRepMakePartial 。

  在第一個(gè)例子中,在關(guān)閉數(shù)據(jù)庫(kù)之前加入代碼:.MakeReplica "NwReplica", "replica of nwind.mdb",則從Nwind.mdb設(shè)計(jì)正本復(fù)制出一個(gè)名為NwReplica.mdb的副本,位置在Nwind.mdb同一目錄中。以下是一個(gè)通過(guò)傳遞參數(shù)的形式,在實(shí)際應(yīng)用中可供靈活調(diào)用的函數(shù),每調(diào)用該函數(shù)一次即可實(shí)現(xiàn)新建一個(gè)副本:


   Function MakeAdditionalReplica(strReplicableDB As String, strNewReplica As String, intOptions As Integer) As Integer
  Dim dbsTemp As Database
  On Error GoTo ErrorHandler
  Set dbsTemp = OpenDatabase(strReplicableDB)
  ' 如果在調(diào)用此函數(shù)時(shí),intOptions處末給出參數(shù), 則忽略該參數(shù)項(xiàng),
  '默認(rèn)建立一個(gè)完全的、可讀/寫(xiě)的副本,否則就利用提供的參數(shù)按要求建立副本
  If intOptions = 0 Then
  dbsTemp.MakeReplica strNewReplica, "Replica of " & strReplicableDB
  Else
  dbsTemp.MakeReplica strNewReplica, "Replica of " & strReplicableDB, intOptions
  End If
  dbsTemp.Close
  ErrorHandler:
  Select Case Err
  Case 0:
  MakeAdditionalReplica = 0
  Exit Function
  Case Else:
  MsgBox "Error " & Err & " : " & Error
  MakeAdditionalReplica = Err
  Exit Function
  End Select
  End Function
 


  3.Synchronize方法:

  Synchronize方法使兩個(gè)完全副本(包括設(shè)計(jì)正本)同步化。其語(yǔ)法為:database.Synchronize pathname, exchange。其中pathname為要同步的目標(biāo)副本的路徑名稱字符串(串中的 .mdb擴(kuò)展名可省略);exchange用來(lái)標(biāo)識(shí)兩個(gè)數(shù)據(jù)庫(kù)之間的同步方向(如表一),這是一個(gè)可選項(xiàng),默認(rèn)為表中的第三個(gè)選項(xiàng),即雙向交換。利用表中第四個(gè)dbRepSyncInternet常量選項(xiàng),還可對(duì)通過(guò)Internet互聯(lián)的數(shù)據(jù)庫(kù)進(jìn)行同步化,
  這時(shí)要將代表本地網(wǎng)絡(luò)路徑選項(xiàng)pathname用URL地址來(lái)代替。

  表一、同步化方向常量

常量 同步化方向
DbRepExportChanges 從數(shù)據(jù)庫(kù)到副本路徑名稱
DbRepImportChanges 從副本路徑名稱到數(shù)據(jù)庫(kù)
DbRepImpExpChanges 雙向交換改變(默認(rèn))
DbRepSyncInternet 在通過(guò)Internet路徑連接的數(shù)據(jù)庫(kù)之間傳遞改變

  在同步化操作之前,要確保已經(jīng)利用 Replicable屬性使一個(gè)數(shù)據(jù)庫(kù)初始出設(shè)計(jì)正本,并且利用MakeReplica方法復(fù)制出了一個(gè)以上的副本。

  以下通過(guò)在第一個(gè)例子添加的副本復(fù)制語(yǔ)句之后,加入如下語(yǔ)句:.Synchronize "NwReplica.mdb", dbRepExportChanges,實(shí)現(xiàn)把數(shù)據(jù)庫(kù)Nwind的設(shè)計(jì)正本的任何改變傳遞給副本 NwReplica。我們可以在Nwind.mdb庫(kù)中改變一些數(shù)據(jù)內(nèi)容,然后再運(yùn)行這一例子,我們會(huì)發(fā)現(xiàn)Nwind.mdb庫(kù)的改變已經(jīng)反映在NwReplica.mdb這一副本中了。

  以上語(yǔ)句實(shí)現(xiàn)從數(shù)據(jù)庫(kù)到副本路徑名稱的同步(把設(shè)計(jì)正本的數(shù)據(jù)或結(jié)構(gòu)改變傳遞給副本),把dbRepExportChanges常量改為dbRepImportChanges和dbRepImpExpChanges可分別實(shí)現(xiàn)從副本路徑名稱到數(shù)據(jù)庫(kù)(數(shù)據(jù)庫(kù)接收副本上的改變)以及雙向交換(兩者間的雙向數(shù)據(jù)傳遞)同步。

  Synchronize方法還可對(duì)通過(guò)Internet互聯(lián)的數(shù)據(jù)庫(kù)進(jìn)行同步化,以下語(yǔ)句實(shí)現(xiàn)本地?cái)?shù)據(jù)庫(kù)正本與位于Internet服務(wù)器上的一個(gè)副本同步化:dbNwind.Synchronize "

  4.PopulatePartial 方法:

  上面介紹利用Synchronize方法使兩個(gè)完全副本同步化,不會(huì)出現(xiàn)問(wèn)題,但如果用一個(gè)完全副本來(lái)同步一個(gè)部分副本,因?yàn)椴糠指北臼怯筛北具^(guò)濾器來(lái)從完全副本來(lái)過(guò)濾重新生成的,因此可能在部分副本中產(chǎn)生所謂的“孤立”記錄,即這些記錄不能再與其他副本保持同步。要解決這一問(wèn)題引入了另一個(gè)稱為PopulatePartial的方法,該方法與Synchronize方法類似,只不過(guò)它是實(shí)現(xiàn)部分副本與完全副本的同步,在同步時(shí),首先清除部分副本中的所有記錄,然后根據(jù)當(dāng)前副本的過(guò)濾器來(lái)重新生成部分副本,這樣就解決了“孤立”記錄的問(wèn)題。其語(yǔ)法為:database.PopulatePartial dbname。dbname是完全副本的路徑名稱。由于篇幅所限以及其與Synchronize方法的相似性,因此在此不再累述,更詳細(xì)的描述請(qǐng)參閱相關(guān)的聯(lián)機(jī)幫助。