2.使對象可以復制
如果在復本中建立了一個新對象,並且想把它從本地的改為可復制的,使得其它用戶都可以使用它,則需要在設計原版中建立該對象,並且將其Replicab1e屬性設置為“T”。在這種情況下,務必刪除所有復本中的這個本地對象,否則會產生一個錯誤。
對於TableDef和QueryDef對象,可以直接建立Replicab1e屬性,並添加到對象的屬性集合中,就像處理KeepLocal屬性那樣。而對於由宿主應用程序所定義的窗體、報表、宏和模塊,則應建立Replicable屬性,然後添加到表示該對象的Document對象的屬性集合中。
在下一次同步時,新的可復制對象將出現在集合的其它復本中。類似地,如果想把可復制對象改為本地對象,則應將其Replicab1e屬性設置為“F”。和KeepLocal屬性一樣,如果正在設置Replicab1e屬性的對象已經從其它對象繼承了這個屬性,則其它對象設置的值對這個對象不起作用,必須直接對每個對象設置Rep1icab1e屬性。
注意,如果把一個對象的Replicab1e屬性從“T”改為“F”,該對象便從可復制狀態變為本地的,在這種情況下,MicrosoftJet將只在設計原版中保留該對象,而從復本集的其它復本中刪掉。在改變表的可復制狀態時,應當格外小心。即使在設計原版中暫時把一個可復制表改變為本地表,然後再改回可復制的,但下次同步時仍然將會在每個復本中刪除並重建該表。除非在進行設計變更之前同步所有的復本,否則將會丟失自上次同步以來輸入到表中的所有數據。
3.構造設計原版
設計原版也是一個數據庫復本,但它是一個可以復制的復本。為了把一個數據庫變為
設計原版,需要為Database對象建立Rep1icab1e屬性,並把該屬性添加到Database對象的
屬性集合中,然後將其Replicab1e屬性設置為“T”。
【例】編寫一個Function過程,把指定的數據庫變為設計原版。
過程如下:
PublicFunctionSetReplicable(strDBAsString)Asinteger
DimprpReplicableAsProperty
DimdbsTargetAsDatabase
OnErrorGoToErrorHandler
SetdbsTarget=OpenDatabase(strDB,True)
‘若屬性已存在,則關閉錯誤處理
OnErrorResumeNext
'創建Replicable屬性
SetprpReplicable=dbsTarget.Createproperty("Replicable",dbText,''T'`)
'把該屬性添加到屬性集合中
dbsTarget.Properties.AppendprpReplicable
'把該屬性設置為"T"
dbsTarget.PrOperties("Replicable")=''T''
SetReplicable=0
ErrorHandler:
SelectCaseErr
Case0
SetReplicable=0
ExitFunction
CaseElse
MsgBox"Error"&Err":"&Error
SetReplicable=-1
ExitFunction
EndSelect
EndFunction
上述過程把指定的數據庫轉換為設計原版。如果Rep1icab1e屬性不存在,則建立該屬性,井把它設置為指定的值。
為了調用上述過程,可以在窗體上畫一個命令按鈕,然後編寫如下的事件過程:
PrivateSubConunandl_Click()
DimMyDBAsDatabase
DimaAsinteger
a=SetReplicable(''c:dbdirdbl.mdb``)
Ifa=0Then
MsgBox"成功設置Replicable屬性"
Else
MsgBox"設置失敗"
Endif
Endsub
運行程序,單擊命令按鈕,將調用SetReplicable過程,為指定的數據庫添加和設置Replicab1e屬性,並根據執行情況顯示相應的信息。在轉換進程中,MicrosoftJet將維持原始數據庫的所有屬性設置值。
4.用復本生成復本
當把數據庫的Replicable屬性設置為“T”,從而將數據庫轉換成設計原版時,在復本集中只有一個復本(即設計原版),只能用它來生成第一個復本。可以用MakeReplica方法來生成第一個復本和後續的復本。
用設計原版生成數據庫的第一個復本後,可以用集合中的任一復本來生成另外的復本。事實上,在復本集中增加數據庫新備份的唯一途徑,就是從一個現存的復本來建立它們。一旦立好,新復本即成為復本集的一部分。所有復本都有唯一的標識,並能相互通信和同步。每個復本集與所有其它復本集是互相獨立的,不同復本集的復本不能相互通信或同步。
注意,在原始數據庫的備份被變成設計原版之前,不要用它來生成另外的復本。否則,生成的將不是另外的復本,而是新的設計原版和復本集。
【例】編寫一個過程,用來生成數據庫復本。
過程如下:
FunctionMakeAdditionalReplica(strReplicaAsString,strNewReplicaAsString,intOptionsAsInteger)Asinteger
DimdbsAsDatabase
OnErrorGoToErrorHandler
Setdbs=OpenDatabase(strReplicableDB)
'如果沒有選項傳遞給MakeAdditionalReplilca,
'就忽略選項參數,該選項參數的缺省值是完全的,讀/寫復本;
'否則,使用intoptions的值
IfintOptions=0Then
dbs.MakeReplicastrNewReplica,"Replicaof"&strReplicableDB
Else
dbs.MakeReplicastrNewReplica,"Replicaof"&strReplicableDB,intOptions
Endif
dbs.Close
ErrorHandler:
SelectCaseErr
Case0:
MakeAdditionalReplica=0
ExitFunction
CaseElse:
MsgBox"error"&err":"&Error
MakeAdditionalReplica=-1
Exitfunction
Endselect
Endfunction
上述過程可以從一個數據庫復本生成一個新的復本。該過程有3個參數,其中第一個參數是數據庫復本的文件名,第二個參數是新生成的數據庫復本的文件名,第三個參數,即intOptions,可以是DAO常數dbRepMakeReadOnly和dbRepMakePartial的組合,也可以是0。dbRepMakeReadOnly常數表示復本是只讀的,而dbRepMakePartial常數表示復本是部分復本,不是完全復本。例如,為了建立一個只讀部分復本,在調用過程MakeAdditionalReplica時,應當把dbRepMakeReadon1y+dbRepMakePartial的值傳遞給intOptions參數。如果intOptions參數是0,則過程將建立一個完全的讀/寫復本,因為忽略了MakeReplica方法中的options參數。
為了調用上述過程建立數據庫復本,可以在窗體上畫一個命令按鈕,然後編寫如下的事件過程:
PrivateSubCommand1_Click()
A=MakeAdditionalReplica("c:dbdirdblcopy1.mdb","c:dbdirdblcopy2.mdb",0)
ifa=oThen
MsgBox"己生成數據庫復本"
Else
MsgBox“操作失敗”
Endlf
Endsub
過程中的dblcopy1.mdb是數據庫db1.mdb的復本,而dblcopy2.mdb是dblcopyl.mdb的復本。運行程序,單擊命令按鈕,將建立一個完全的讀/寫復本。
當MicrosoftJet建立新復本時,新復本將包含源復本的所有數據定義語言屬性設置值。後續的復本可以由設計原版或集合中的任一復本來生成。
在用MakeRep1ica方法復制數據庫時,正在復制的對象一定不能是鎖定的,否則方法的調用會失敗。如果一個對象以設計模式打開或在同步期間被更新,則該對象會被MicrosoftJet鎖定。在實際的程序設計中,一定要注意這一點,不要試圖從擁有鎖定對象的數據庫來生成復本。
注意,生成一個新復本後,將把源復本中的所有可復制對象和屬性復制到新復本中。雖然所有鏈接表也被復制,但如果新復本位於網絡上,鏈接表的路徑可能會不正確。因此,一定要對新復本進行測試,以確定是否需要為鏈接表建立新路徑。->