所謂建立數據庫復本,實際上就是建立數據庫的拷貝。通過數據庫復制,每個用戶都可以使用數據庫中數據的一份拷貝,並可在某個時亥把各個數據庫重新組合成宿主數據庫,而對宿主數據庫的修改都傳送到數據庫復本。注意,數據庫復制功能僅對MicrosoftJet3.5版的數據庫有效。
MicrosoftJet數據庫引擎不允許用數據庫密碼來保護復制數據庫。在開始使用復本之前,必須先從將要復制的數據庫中刪去所有數據庫密碼保護。設置用戶權限與復本同步沒有沖突。
用DAO復制數據庫的一般步驟如下:
(1)識別數據庫中不需要復制的對象,並將它們的KeepLocal屬性設置為“T”。
(2)將數據庫的Replicable屬性設置為“T”,使它變成設計原版。
(3)用MakeReplica方法從設計原版中生成附加的復本。
在設置Replicable屬性之前,應先確定在轉換數據庫以前數據庫是否已經被復制。
1.保持對象本地化
當把正常的數據庫轉換為設計原版時,將復制數據庫中的所有對象。如果不想把數據中的所有對象都放在復本集中,則可對不想復制的對象添加並設置KeepLocal屬性。例如,果數據庫中有一個表,在該表中含有機密的工資信息、初始化信息或登錄到數據庫的用名,則可能希望不把這些信息放到復本中。在這種情況下,可將該表的KeepLocal屬性設為“T”,使得復制數據庫時,這些信息不被復制。
對於TableDef和QueryDef對象,可以建立keepLocal屬性並把它添加到對象的屬性集合中。對於由主機應用程序定義的窗體、報表、宏以及模塊,可以建立KeepLocal屬性並把它添加到表示該對象的Document對象的屬性集合中。
注意,在設置keepLocal(以及Rep1icab1e)屬性之前,必須先建立它,然後添加到將使用它的對象的屬性集合中。如果在建立並添加該屬性之前先引用了它,則將產生一個運行時錯誤。
【例】編寫一個Function過程,對數據庫中指定的對象進行本地化處理。
FunctionSetKeepLocal(dbsAsDatabase,strCollectionAsString,stffobJectAsString)Asinteger
DimiAsInteger
DimblnMatchAsBoolean
DimtdfAsTableDef
DimPrPAsProperty
DimdocAsDocument
DimqdfAsQueryDef
OnErrorGoToErrorHandler
SelectCasestalollection
Case"FormS","RelpOrtS",''MOdllleS'',''SCriptS`'
Setdoc=dbs.Containers(strCollection).Documents(strObject)
Setprp=doc.Createproperty("KeepLocal",dbText,`'T'')
doc.Properties.Appendprp
Case"TableDefs"
Settdf=dbs.TableDefs(strObJect)
Setprp=tdfCreateproperty(''KeepLocal'',dbText,''T'')
tdfprol)etties.Appendprp
Case''QuecyDefs'`
Setqdf=dbs.QueryDefs(sbrobject)
Setprp=qdf.Createproperty("KeepLocal",dbText,"T")
qdf.properties.AppendPrP
EndSelect
ErrorHandler:
SelectCaseErr
Case0
case3265'對象未發現
SetKeepLocal=3265
ExitFunction
'屬性已經存在,把它設置為“T”
Case3367
SelectCasesttoollection
CSSel''Forms'',''RelportS'',``Modlules'',''ScriptS'`
doc.Properties(''KeepLocal'`).Value=`'T'`
Case''TableDefs'`
tdf.Properties(''KeepLocal'').Value=`'T'`
Case''QueryDefs'`
qdf.Properties(''KeepLocal'').Value=''T'`
ExitFunction
EndSelect
SetKeepLocal=0
ExitFunction
CaseElse
MsgBOx''Error''&Err&":",&Error,vbOKOnly
SetKeepLocal=-1
ExitFunction
EndSelect
EndFunction
用上述過程可以對指定數據庫對象建立並添加KeepLocal屬性,如果該屬性已經存在,則將產生代碼為3367的錯誤,在這種情況下,將在錯誤處理程序中把該屬性的值設置為“T”
該過程有3個參數,其中第一個參數是Database對象,第二個參數是集合的名字,第三個參數是數據庫中的對象名。過程的返回值是一個整型數,它實際上是一個錯誤代碼。為了調用上面的過程,可以在窗體上畫一個命令按鈕,然後編寫如下的事件過程:
PrivateSubCommand1_Click()
DimMyDbAsDatabase
DimaAsinteger
SetMyDb=OpenDatabase(''c:dbdirdb1.mdb'')
a=SetKeepLocal(MyDb,''TableDefs'',''Tabel1'')
Ifa=0Then
MsgBox"已成功設置KeepLocal屬性"
Elselfa=3265Then
MsgBox"對象未找到"
Elselfa=3367Then
MsgBox"KeepLocal屬性已存在,設置為“T”
Else
MsgBox“出錯”
Endlf
Endsub
該事件過程調用SetKeepLocal過程,用來建立並設置數據庫db1.mdb的TableDefs集合中Tabel1對象的KeepLocal屬性。
如果已經在數據庫的兩個表之間建立起關系,則必須將兩個表的keepLocal屬性設置為相同的值,即兩個表都必須是本地的或者是可復制的。如果兩個表的keepLocal屬性設置不一樣,則轉換將會失敗。但是應注意,不能在關系有效時設置keepLocal屬性,也就是說,在設置屬性之前,應先刪除兩個表之間的關系,在設置好KeepLocal屬性之後再恢復兩個表之間的關系,然後繼續進行數據庫轉換。
如果正在設置KeepLocal屬性的對象已經從其它對象中繼承了該屬性,則由其它對象設置的值對保留為本地對象的操作沒有影響,必須直接為每個對象設置keepLocal屬性。->