Chinaunix首页 | 论坛 | 博客
  • 博客访问: 663481
  • 博文数量: 759
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 4845
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-27 13:51
文章分类

全部博文(759)

文章存档

2011年(1)

2008年(758)

我的朋友

分类:

2008-10-27 13:53:30


  所谓建立数据库复本,实际上就是建立数据库的拷贝。通过数据库复制,每个用户都可以使用数据库中数据的一份拷贝,并可在某个时亥把各个数据库重新组合成宿主数据库,而对宿主数据库的修改都传送到数据库复本。注意,数据库复制功能仅对Microsoft Jet 3.5版的数据库有效。
  
    Microsoft Jet 数据库引擎不允许用数据库密码来保护复制数据库。在开始使用复本之前,必须先从将要复制的数据库中删去所有数据库密码保护。设置用户权限与复本同步没有冲突。
  
    用DAO复制数据库的一般步骤如下:
  
    (1)识别数据库中不需要复制的对象,并将它们的KeepLocal属性设置为“T”。
  
    (2)将数据库的Replicable属性设置为“T”,使它变成设计原版。
  
    (3)用MakeReplica方法从设计原版中生成附加的复本。
  
  在设置Replicable属性之前,应先确定在转换数据库以前数据库是否已经被复制。
  
    1.保持对象本地化
  
    当把正常的数据库转换为设计原版时,将复制数据库中的所有对象。如果不想把数据中的所有对象都放在复本集中,则可对不想复制的对象添加并设置KeepLocal属性。例如,果数据库中有一个表,在该表中含有机密的工资信息、初始化信息或登录到数据库的用名,则可能希望不把这些信息放到复本中。在这种情况下,可将该表的KeepLocal属性设为“T”,使得复制数据库时,这些信息不被复制。
  
    对于TableDef 和 QueryDef对象,可以建立keepLocal属性并把它添加到对象的属性集合中。对于由主机应用程序定义的窗体、报表、宏以及模块,可以建立KeepLocal属性并把它添加到表示该对象的Document对象的属性集合中。
  
  注意,在设置keepLocal (以及Rep1icab1e )属性之前,必须先建立它,然后添加到将使用它的对象的属性集合中。如果在建立并添加该属性之前先引用了它,则将产生一个运行时错误。
    【例】编写一个Function 过程,对数据库中指定的对象进行本地化处理。
  
    Function SetKeepLocal(dbs As Database, strCollection As String, stffobJect As String) As integer
  
    Dim i As Integer
  
    Dim blnMatch As Boolean
  
    Dim tdf As TableDef
  
    Dim PrP As Property
  
    Dim doc As Document
  
    Dim qdf As QueryDef
  
    On Error GoTo ErrorHandler
  
    Select Case stalollection
  
     Case "FormS", "RelpOrtS", ''MOdllleS'', ''SCriptS`'
  
       Set doc = dbs.Containers(strCollection). Documents(strObject)
  
       Set prp = doc.Createproperty ("KeepLocal", dbText, `'T'')
  
       doc.Properties.Append prp
  
     Case "TableDefs"
  
       Set tdf = dbs.TableDefs(strObJect)
  
       Set prp = tdfCreateproperty (''KeepLocal'', dbText, ''T'')
  
       tdfprol)etties.Append prp
  
     Case ''QuecyDefs'`
  
       Set qdf=dbs.QueryDefs(sbrobject)
  
       Set prp = qdf.Createproperty ("KeepLocal", dbText, "T")
  
       qdf.properties.Append PrP
  
    End Select
  
  ErrorHandler:
  
    Select Case Err
  
     Case 0
  
      case 3265 '对象未发现
  
      SetKeepLocal = 3265
  
      Exit Function
  
      '属性已经存在,把它设置为“T”
  
     Case 3367
  
      Select Case sttoollection
  
       el ''Forms'' , ''RelportS'', ``Modlules'' , ''ScriptS'`
  
       doc.Properties(''KeepLocal'`).Value = `'T'`
  
     Case ''TableDefs'`
  
       tdf.Properties(''KeepLocal'').Value = `'T'`
  
     Case ''QueryDefs'`
  
       qdf.Properties(''KeepLocal'').Value = ''T'`
  
     Exit Function
  
    End Select
  
    SetKeepLocal = 0
  
    Exit Function
  
    Case Else
  
     MsgBOx ''Error'' & Err & ":", & Error, vbOKOnly
  
     SetKeepLocal=-1
  
     Exit Function
  
     End Select
  
    End Function
  
  用上述过程可以对指定数据库对象建立并添加KeepLocal属性,如果该属性已经存在,则将产生代码为3367的错误,在这种情况下,将在错误处理程序中把该属性的值设置为“T”
  
    该过程有3个参数,其中第一个参数是Database对象,第二个参数是集合的名字,第三个参数是数据库中的对象名。过程的返回值是一个整型数,它实际上是一个错误代码。为了调用上面的过程,可以在窗体上画一个命令按钮,然后编写如下的事件过程:
  
    Private Sub Command1_Click()
  
     Dim MyDb As Database
  
     Dim a As integer
  
     Set MyDb = OpenDatabase(''c:\dbdir\db1.mdb'')
  
     a = SetKeepLocal(MyDb, ''TableDefs'',''Tabel1'')
  
     If a = 0 Then
  
      MsgBox "已成功设置KeepLocal 属性"
  
     Elself a = 3265 Then
  
      MsgBox "对象未找到"
  
     Elself a = 3367 Then
  
      MsgBox "KeepLocal属性已存在,设置为“T”
  
     Else
  
      MsgBox“出错”
  
     End lf
  
    End sub
  
  该事件过程调用SetKeepLocal过程,用来建立并设置数据库db1.mdb的TableDefs集合中Tabel1对象的KeepLocal属性。
  
    如果已经在数据库的两个表之间建立起关系,则必须将两个表的keepLocal属性设置为相同的值,即两个表都必须是本地的或者是可复制的。如果两个表的keepLocal属性设置不一样,则转换将会失败。但是应注意,不能在关系有效时设置keepLocal属性,也就是说,在设置属性之前,应先删除两个表之间的关系,在设置好KeepLocal属性之后再恢复两个表之间的关系,然后继续进行数据库转换。
  
    如果正在设置KeepLocal属性的对象已经从其它对象中继承了该属性,则由其它对象设置的值对保留为本地对象的操作没有影响,必须直接为每个对象设置keepLocal属性。
    2.使对象可以复制
  
    如果在复本中建立了一个新对象,并且想把它从本地的改为可复制的,使得其它用户都可以使用它,则需要在设计原版中建立该对象,并且将其Replicab1e属性设置为“T”。在这种情况下,务必删除所有复本中的这个本地对象,否则会产生一个错误。
  
    对于TableDef和QueryDef对象,可以直接建立Replicab1e属性,并添加到对象的属性集合中,就像处理KeepLocal属性那样。而对于由宿主应用程序所定义的窗体、报表、宏和模块,则应建立Replicable属性,然后添加到表示该对象的Document对象的属性集合中。
  
    在下一次同步时,新的可复制对象将出现在集合的其它复本中。类似地,如果想把可复制对象改为本地对象,则应将其Replicab1e属性设置为“F”。和KeepLocal属性一样,如果正在设置Replicab1e属性的对象已经从其它对象继承了这个属性,则其它对象设置的值对这个对象不起作用,必须直接对每个对象设置Rep1icab1e属性。
  
    注意,如果把一个对象的Replicab1e属性从“T”改为“F”,该对象便从可复制状态变为本地的,在这种情况下, Microsoft Jet将只在设计原版中保留该对象,而从复本集的其它复本中删掉。在改变表的可复制状态时,应当格外小心。即使在设计原版中暂时把一个可复制表改变为本地表,然后再改回可复制的,但下次同步时仍然将会在每个复本中删除并重建该表。除非在进行设计变更之前同步所有的复本,否则将会丢失自上次同步以来输入到表中的所有数据。
    3.构造设计原版
  
    设计原版也是一个数据库复本,但它是一个可以复制的复本。为了把一个数据库变为设计原版,需要为Database对象建立Rep1icab1e属性,并把该属性添加到Database对象的属性集合中,然后将其Replicab1e属性设置为“T”。
  
    【例】编写一个Function过程,把指定的数据库变为设计原版。
  
    过程如下:
  
    Public Function SetReplicable(strDB As String)As integer
  
     Dim prpReplicable As Property
  
     Dim dbsTarget As Database
  
     n Error GoTo ErrorHandler
  
     Set dbsTarget = OpenDatabase(strDB,True)
  
     ‘若属性已存在,则关闭错误处理
  
    On Error Resume Next
  
     ' 创建Replicable 属性
  
     Set prpReplicable =dbsTarget.Createproperty( "Replicable", dbText, ''T'`)
  
     '把该属性添加到属性集合中
  
     dbsTarget.Properties.Append p
【责编:admin】
--------------------next---------------------

阅读(327) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~