使ACCESS數(shù)據(jù)庫保持同步
2024-09-07 19:04:56
供稿:網(wǎng)友
同步(synchronization)是數(shù)據(jù)庫在網(wǎng)絡環(huán)境中應用所要涉及到的一個重要概念。其基本過程大致分以下幾個步驟:首先把一個數(shù)據(jù)庫設為可復制副本屬性,使其成為設計正本(vb中稱設計原版,access中稱設計母版);然后根據(jù)應用程序的實現(xiàn)需要從設計正本復制出多個副本(vb中稱復本),這些副本組成一個副本集合(設計正本也被看做是第一個的、初始的副本);最后在集中任何復本的數(shù)據(jù)或結構被更改會時啟用同步機制把改變發(fā)送并且應用于此復本集中的其他成員,使得副本集中的成員在數(shù)據(jù)或結構上保持一致性。實現(xiàn)同步的這一過程被稱為同步化。vb6.0為實現(xiàn)同步,在數(shù)據(jù)庫對象中提供了多個屬性與方法來實現(xiàn)這一過程,以下介紹主要的幾個屬性與方法,分別對應同步化的幾個步驟:
1.replicable屬性:
replicable屬性用來使一個數(shù)據(jù)庫對象或數(shù)據(jù)庫中的表對象、查詢對象等對象成為可復制副本的,即成為設計正本。但數(shù)據(jù)庫對象并不提供replicable這一屬性,因此首先要用createpropety方法來創(chuàng)建它,然后把它添加到對象的屬性集中,最后再給它賦值,使數(shù)據(jù)庫成為設計正本。對于數(shù)據(jù)庫對象而言,把replicable屬性設置為“t”將使數(shù)據(jù)庫對象成為可復制的。以下代碼將使vb6.0安裝目錄下附帶的nwind.mdb數(shù)據(jù)庫成為一個設計正本(為確保安全建議在操作前備份這一庫文件):
private sub command1_click()
dim dbnwind as database
'如果末引用dao則一定要先引用
dim prpnew as property
set dbnwind = opendatabase("nwind.mdb", true)
with dbnwind
'建立replicable屬性,如果已經(jīng)存在該屬性則程序略過這一步
on error resume next
set prpnew = .createproperty("replicable", dbtext, "t")
.properties.append prpnew
'設置數(shù)據(jù)庫的replicable屬性為true
.properties("replicable") = "t"
.close
end with
end sub
2.makereplica方法:
makereplica方法從設計正本復制出一個新的完全副本。其語法為:database.makereplica replica, description, options,其中replica是代表一個新副本路徑名稱的字符串;description是對正在創(chuàng)建的新副本的一個描述字符串;options是一個可選項,可以是dbrepmakepartial常量(創(chuàng)建一個部分副本)或dbrepmakereadonly常量(防止用戶修改新副本中的可復制對象),如果要建立的是一個只讀式的部分副本,則要加入?yún)?shù)常量 dbrepmakereadonly + dbrepmakepartial 。
在第一個例子中,在關閉數(shù)據(jù)庫之前加入代碼:.makereplica "nwreplica", "replica of nwind.mdb",則從nwind.mdb設計正本復制出一個名為nwreplica.mdb的副本,位置在nwind.mdb同一目錄中。以下是一個通過傳遞參數(shù)的形式,在實際應用中可供靈活調用的函數(shù),每調用該函數(shù)一次即可實現(xiàn)新建一個副本:
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)
' 如果在調用此函數(shù)時,intoptions處末給出參數(shù), 則忽略該參數(shù)項,
'默認建立一個完全的、可讀/寫的副本,否則就利用提供的參數(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方法使兩個完全副本(包括設計正本)同步化。其語法為:database.synchronize pathname, exchange。其中pathname為要同步的目標副本的路徑名稱字符串(串中的 .mdb擴展名可省略);exchange用來標識兩個數(shù)據(jù)庫之間的同步方向(如表一),這是一個可選項,默認為表中的第三個選項,即雙向交換。利用表中第四個dbrepsyncinternet常量選項,還可對通過internet互聯(lián)的數(shù)據(jù)庫進行同步化,
這時要將代表本地網(wǎng)絡路徑選項pathname用url地址來代替。
表一、同步化方向常量
常量 同步化方向
dbrepexportchanges 從數(shù)據(jù)庫到副本路徑名稱
dbrepimportchanges 從副本路徑名稱到數(shù)據(jù)庫
dbrepimpexpchanges 雙向交換改變(默認)
dbrepsyncinternet 在通過internet路徑連接的數(shù)據(jù)庫之間傳遞改變
在同步化操作之前,要確保已經(jīng)利用 replicable屬性使一個數(shù)據(jù)庫初始出設計正本,并且利用makereplica方法復制出了一個以上的副本。
以下通過在第一個例子添加的副本復制語句之后,加入如下語句:.synchronize "nwreplica.mdb", dbrepexportchanges,實現(xiàn)把數(shù)據(jù)庫nwind的設計正本的任何改變傳遞給副本 nwreplica。我們可以在nwind.mdb庫中改變一些數(shù)據(jù)內容,然后再運行這一例子,我們會發(fā)現(xiàn)nwind.mdb庫的改變已經(jīng)反映在nwreplica.mdb這一副本中了。
以上語句實現(xiàn)從數(shù)據(jù)庫到副本路徑名稱的同步(把設計正本的數(shù)據(jù)或結構改變傳遞給副本),把dbrepexportchanges常量改為dbrepimportchanges和dbrepimpexpchanges可分別實現(xiàn)從副本路徑名稱到數(shù)據(jù)庫(數(shù)據(jù)庫接收副本上的改變)以及雙向交換(兩者間的雙向數(shù)據(jù)傳遞)同步。
synchronize方法還可對通過internet互聯(lián)的數(shù)據(jù)庫進行同步化,以下語句實現(xiàn)本地數(shù)據(jù)庫正本與位于internet服務器上的一個副本同步化:dbnwind.synchronize "www.mycompany.myserver.com" & "/files/nwreplica.mdb", dbrepimpexpchanges + dbrepsyncinternet
4.populatepartial 方法:
上面介紹利用synchronize方法使兩個完全副本同步化,不會出現(xiàn)問題,但如果用一個完全副本來同步一個部分副本,因為部分副本是由副本過濾器來從完全副本來過濾重新生成的,因此可能在部分副本中產(chǎn)生所謂的“孤立”記錄,即這些記錄不能再與其他副本保持同步。要解決這一問題引入了另一個稱為populatepartial的方法,該方法與synchronize方法類似,只不過它是實現(xiàn)部分副本與完全副本的同步,在同步時,首先清除部分副本中的所有記錄,然后根據(jù)當前副本的過濾器來重新生成部分副本,這樣就解決了“孤立”記錄的問題。其語法為:database.populatepartial dbname。dbname是完全副本的路徑名稱。由于篇幅所限以及其與synchronize方法的相似性,因此在此不再累述,更詳細的描述請參閱相關的聯(lián)機幫助