程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 復制數據庫(2)--網絡數據庫的復制和同步(6)

復制數據庫(2)--網絡數據庫的復制和同步(6)

編輯:VB綜合教程
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鎖定。在實際的程序設計中,一定要注意這一點,不要試圖從擁有鎖定對象的數據庫來生成復本。
  
  注意,生成一個新復本後,將把源復本中的所有可復制對象和屬性復制到新復本中。雖然所有鏈接表也被復制,但如果新復本位於網絡上,鏈接表的路徑可能會不正確。因此,一定要對新復本進行測試,以確定是否需要為鏈接表建立新路徑。->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved