同步(
Synchronization
)是数据库在网络环境中应用所要涉及到的一个重要概念。其基本过程大致分以下几个步骤:首先把一个数据库设为可复制副本属性,使其成为设计正本(
VB
中称设计原版,
ACCESS
中称设计母版);然后根据应用程序的实现需要从设计正本复制出多个副本(
VB
中称复本),这些副本组成一个副本集合(设计正本也被看做是第一个的、初始的副本);最后在集中任何复本的数据或结构被更改会时启用同步机制把改变发送并且应用于此复本集中的其他成员,使得副本集中的成员在数据或结构上保持一致性。实现同步的这一过程被称为同步化。
VB6.0
为实现同步,在数据库对象中提供了多个属性与方法来实现这一过程,以下介绍主要的几个属性与方法,分别对应同步化的几个步骤:
1 . Replicable 属性:
Replicable 属性用来使一个数据库对象或数据库中的表对象、查询对象等对象成为可复制副本的,即成为设计正本。但数据库对象并不提供 Replicable 这一属性,因此首先要用 CreatePropety 方法来创建它,然后把它添加到对象的属性集中,最后再给它赋值,使数据库成为设计正本。对于数据库对象而言,把 Replicable 属性设置为 “T” 将使数据库对象成为可复制的。以下代码将使 VB6.0 安装目录下附带的 Nwind.mdb 数据库成为一个设计正本(为确保安全建议在操作前备份这一库文件):
Private Sub Command1_Click()
Dim dbNwind As Database
' 如果末引用 DAO 则一定要先引用
Dim prpNew As Property
Set dbNwind = OpenDatabase("Nwind.mdb", True)
With dbNwind
' 建立 Replicable 属性,如果已经存在该属性则程序略过这一步
On Error Resume Next
Set prpNew = .CreateProperty("Replicable", dbText, "T")
.Properties.Append prpNew
' 设置数据库的 Replicable 属性为 True
.Properties("Replicable") = "T"
.Close
End With
End Sub
2 . MakeReplica 方法:
MakeReplica 方法从设计正本复制出一个新的完全副本。其语法为: database.MakeReplica replica, description, options ,其中 replica 是代表一个新副本路径名称的字符串; description 是对正在创建的新副本的一个描述字符串; options 是一个可选项,可以是 dbRepMakePartial 常量(创建一个部分副本)或 dbRepMakeReadOnly 常量(防止用户修改新副本中的可复制对象),如果要建立的是一个只读式的部分副本,则要加入参数常量 dbRepMakeReadOnly + dbRepMakePartial 。
在第一个例子中,在关闭数据库之前加入代码: .MakeReplica "NwReplica", "replica of nwind.mdb" ,则从 Nwind.mdb 设计正本复制出一个名为 NwReplica.mdb 的副本,位置在 Nwind.mdb 同一目录中。以下是一个通过传递参数的形式,在实际应用中可供灵活调用的函数,每调用该函数一次即可实现新建一个副本:
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)
' 如果在调用此函数时, intOptions 处末给出参数 , 则忽略该参数项,
' 默认建立一个完全的、可读 / 写的副本,否则就利用提供的参数按要求建立副本
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 用来标识两个数据库之间的同步方向(如表一),这是一个可选项,默认为表中的第三个选项,即双向交换。利用表中第四个 dbRepSyncInternet 常量选项,还可对通过 Internet 互联的数据库进行同步化,
这时要将代表本地网络路径选项 pathname 用 URL 地址来代替。
表一、同步化方向常量
常量 同步化方向
DbRepExportChanges 从数据库到副本路径名称
DbRepImportChanges 从副本路径名称到数据库
DbRepImpExpChanges 双向交换改变(默认)
DbRepSyncInternet 在通过 Internet 路径连接的数据库之间传递改变
在同步化操作之前,要确保已经利用 Replicable 属性使一个数据库初始出设计正本,并且利用 MakeReplica 方法复制出了一个以上的副本。
以下通过在第一个例子添加的副本复制语句之后,加入如下语句: .Synchronize "NwReplica.mdb", dbRepExportChanges ,实现把数据库 Nwind 的设计正本的任何改变传递给副本 NwReplica 。我们可以在 Nwind.mdb 库中改变一些数据内容,然后再运行这一例子,我们会发现 Nwind.mdb 库的改变已经反映在 NwReplica.mdb 这一副本中了。
以上语句实现从数据库到副本路径名称的同步(把设计正本的数据或结构改变传递给副本),把 dbRepExportChanges 常量改为 dbRepImportChanges 和 dbRepImpExpChanges 可分别实现从副本路径名称到数据库 ( 数据库接收副本上的改变 ) 以及双向交换 ( 两者间的双向数据传递 ) 同步。
Synchronize 方法还可对通过 Internet 互联的数据库进行同步化,以下语句实现本地数据库正本与位于 Internet 服务器上的一个副本同步化: dbNwind.Synchronize "www.mycompany.myserver.com" & "/files/NwReplica.mdb", dbRepImpExpChanges + dbRepSyncInternet
4 . PopulatePartial 方法:
上面介绍利用 Synchronize 方法使两个完全副本同步化,不会出现问题,但如果用一个完全副本来同步一个部分副本,因为部分副本是由副本过滤器来从完全副本来过滤重新生成的,因此可能在部分副本中产生所谓的 “ 孤立 ” 记录,即这些记录不能再与其他副本保持同步。要解决这一问题引入了另一个称为 PopulatePartial 的方法,该方法与 Synchronize 方法类似,只不过它是实现部分副本与完全副本的同步,在同步时,首先清除部分副本中的所有记录,然后根据当前副本的过滤器来重新生成部分副本,这样就解决了 “ 孤立 ” 记录的问题。其语法为: database.PopulatePartial dbname 。 dbname 是完全副本的路径名称。由于篇幅所限以及其与 Synchronize 方法的相似性,因此在此不再累述,更详细的描述请参阅相关的联机帮助 。
1 . Replicable 属性:
Replicable 属性用来使一个数据库对象或数据库中的表对象、查询对象等对象成为可复制副本的,即成为设计正本。但数据库对象并不提供 Replicable 这一属性,因此首先要用 CreatePropety 方法来创建它,然后把它添加到对象的属性集中,最后再给它赋值,使数据库成为设计正本。对于数据库对象而言,把 Replicable 属性设置为 “T” 将使数据库对象成为可复制的。以下代码将使 VB6.0 安装目录下附带的 Nwind.mdb 数据库成为一个设计正本(为确保安全建议在操作前备份这一库文件):
Private Sub Command1_Click()
Dim dbNwind As Database
' 如果末引用 DAO 则一定要先引用
Dim prpNew As Property
Set dbNwind = OpenDatabase("Nwind.mdb", True)
With dbNwind
' 建立 Replicable 属性,如果已经存在该属性则程序略过这一步
On Error Resume Next
Set prpNew = .CreateProperty("Replicable", dbText, "T")
.Properties.Append prpNew
' 设置数据库的 Replicable 属性为 True
.Properties("Replicable") = "T"
.Close
End With
End Sub
2 . MakeReplica 方法:
MakeReplica 方法从设计正本复制出一个新的完全副本。其语法为: database.MakeReplica replica, description, options ,其中 replica 是代表一个新副本路径名称的字符串; description 是对正在创建的新副本的一个描述字符串; options 是一个可选项,可以是 dbRepMakePartial 常量(创建一个部分副本)或 dbRepMakeReadOnly 常量(防止用户修改新副本中的可复制对象),如果要建立的是一个只读式的部分副本,则要加入参数常量 dbRepMakeReadOnly + dbRepMakePartial 。
在第一个例子中,在关闭数据库之前加入代码: .MakeReplica "NwReplica", "replica of nwind.mdb" ,则从 Nwind.mdb 设计正本复制出一个名为 NwReplica.mdb 的副本,位置在 Nwind.mdb 同一目录中。以下是一个通过传递参数的形式,在实际应用中可供灵活调用的函数,每调用该函数一次即可实现新建一个副本:
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)
' 如果在调用此函数时, intOptions 处末给出参数 , 则忽略该参数项,
' 默认建立一个完全的、可读 / 写的副本,否则就利用提供的参数按要求建立副本
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 用来标识两个数据库之间的同步方向(如表一),这是一个可选项,默认为表中的第三个选项,即双向交换。利用表中第四个 dbRepSyncInternet 常量选项,还可对通过 Internet 互联的数据库进行同步化,
这时要将代表本地网络路径选项 pathname 用 URL 地址来代替。
表一、同步化方向常量
常量 同步化方向
DbRepExportChanges 从数据库到副本路径名称
DbRepImportChanges 从副本路径名称到数据库
DbRepImpExpChanges 双向交换改变(默认)
DbRepSyncInternet 在通过 Internet 路径连接的数据库之间传递改变
在同步化操作之前,要确保已经利用 Replicable 属性使一个数据库初始出设计正本,并且利用 MakeReplica 方法复制出了一个以上的副本。
以下通过在第一个例子添加的副本复制语句之后,加入如下语句: .Synchronize "NwReplica.mdb", dbRepExportChanges ,实现把数据库 Nwind 的设计正本的任何改变传递给副本 NwReplica 。我们可以在 Nwind.mdb 库中改变一些数据内容,然后再运行这一例子,我们会发现 Nwind.mdb 库的改变已经反映在 NwReplica.mdb 这一副本中了。
以上语句实现从数据库到副本路径名称的同步(把设计正本的数据或结构改变传递给副本),把 dbRepExportChanges 常量改为 dbRepImportChanges 和 dbRepImpExpChanges 可分别实现从副本路径名称到数据库 ( 数据库接收副本上的改变 ) 以及双向交换 ( 两者间的双向数据传递 ) 同步。
Synchronize 方法还可对通过 Internet 互联的数据库进行同步化,以下语句实现本地数据库正本与位于 Internet 服务器上的一个副本同步化: dbNwind.Synchronize "www.mycompany.myserver.com" & "/files/NwReplica.mdb", dbRepImpExpChanges + dbRepSyncInternet
4 . PopulatePartial 方法:
上面介绍利用 Synchronize 方法使两个完全副本同步化,不会出现问题,但如果用一个完全副本来同步一个部分副本,因为部分副本是由副本过滤器来从完全副本来过滤重新生成的,因此可能在部分副本中产生所谓的 “ 孤立 ” 记录,即这些记录不能再与其他副本保持同步。要解决这一问题引入了另一个称为 PopulatePartial 的方法,该方法与 Synchronize 方法类似,只不过它是实现部分副本与完全副本的同步,在同步时,首先清除部分副本中的所有记录,然后根据当前副本的过滤器来重新生成部分副本,这样就解决了 “ 孤立 ” 记录的问题。其语法为: database.PopulatePartial dbname 。 dbname 是完全副本的路径名称。由于篇幅所限以及其与 Synchronize 方法的相似性,因此在此不再累述,更详细的描述请参阅相关的联机帮助 。