如何指定快照同步、下载同步、上载同步和双向同步
Sync Framework 支持快照同步、下载同步、上载同步和双向同步。由于 Sync Framework 具有的灵活性,可以为不同的表指定不同的同步类型。有关更多信息,请参见用于客户端与服务器同步的体系结构和类。
本主题概述了每种同步类型必需的属性。本节中的主题介绍如何配置同步类型,并提供代码示例。
本节内容
确定同步方向的属性
用于表的同步类型取决于对 SyncTable 的 SyncAdapter 和 SyncDirection 属性设置的同步命令。同步命令决定了要同步的数据,而 SyncDirection 属性决定在某个特定会话中实际同步哪些数据。它们经常是相同的:例如,您会指定双向同步以及支持它的命令。但是,在某些情况下,您可能只希望在一个方向上进行同步。例如,销售人员可能需要以仅限下载的方式访问产品数据,而经理可能还需要远程更新这些数据的能力。可以为双向同步指定 SyncAdapter 命令。但是,对于销售人员,SyncDirection 属性被设置为仅限下载。
若要指定同步方向,请将 SyncDirection 属性设置为 SyncDirection 枚举的以下值之一:
然后,对于每个表,请为 SyncAdapter 手动指定一组命令,或者使用 SqlSyncAdapterBuilder 生成这些命令。对于仅限下载同步和双向同步,还必须将服务器配置为跟踪增量数据变更。有关更多信息,请参见跟踪服务器数据库中的变更。
如果是手动创建命令,可以部分或全部地设置 SyncAdapter 的以下属性:
SelectIncrementalInsertsCommand:此属性用在所有类型的同步中。该属性指定从服务器数据库中进行检索的命令:针对快照同步、仅限下载同步和双向同步的初始插入;以及针对仅限下载同步和双向同步的增量插入。默认情况下,该命令还为所有类型的同步从服务器数据库中检索表架构。架构的创建和插入操作由 SqlCeClientSyncProvider 应用于客户端。
SelectIncrementalUpdatesCommand 和 SelectIncrementalDeletesCommand:这些属性用在仅限下载同步和双向同步中。它们指定了从服务器中检索更新和删除的命令,以便 SqlCeClientSyncProvider 能将这些更新和删除应用于客户端。
InsertCommand、UpdateCommand 和 DeleteCommand:这些属性用在仅限上载同步和双向同步中。它们指定将客户端上的插入、更新和删除应用于服务器的命令。
SelectConflictUpdatedRowsCommand 和 SelectConflictDeletedRowsCommand:这些属性通常用在双向同步中。它们指定从服务器上检索更新和删除冲突的命令。有关更多信息,请参见如何处理数据冲突和错误。
手动指定同步命令的优点之一是:可以对命令以及要从客户端上载的变更类型拥有更多的控制。例如,如果想要执行双向同步,但是不想从客户端中上载删除,可以不为 DeleteCommand 属性指定命令。有关比 SqlSyncAdapterBuilder 生成的命令更为复杂的手动命令的示例,请参见如何处理数据冲突和错误。
如果使用 SqlSyncAdapterBuilder 生成命令,请设置 SyncDirection 属性。此属性决定了要为表生成哪些 SyncAdapter 命令。对于快照同步或仅限上载同步,这便是您需要做的所有工作。对于仅限下载同步和双向同步,还必须设置用于标识使用服务器中的哪些列来跟踪变更的属性,以及用于控制是否对数据进行筛选的属性。这些属性如下所示:
基于为这些属性指定的列和筛选值,SqlSyncAdapterBuilder 可生成相应的命令。
变更同步方向
在同步表之后,可以指定一个不同的同步方向。但是,快照同步不会在客户端数据库中启用变更跟踪。如果您预计应用程序在某些时候需要跟踪数据变更,建议不要配置快照同步。如果配置了快照同步,然后再变更为另一种同步类型,必须了解与变更跟踪相关的以下问题:
如果配置了快照同步,然后变更为仅下载同步或双向同步:
可能会再次选择和下载服务器端的行。这会导致在下载阶段产生冲突。
如果配置了快照同步,在客户端数据库中执行变更,然后变更为仅上载同步或双向同步:
则在客户端数据库中所做的任何变更都不会被上载。如果需要上载变更,必须执行每个变更行的“虚更新”**。
如果配置了快照同步,变更为仅上载同步或双向同步,然后在客户端数据库中执行变更:
则在上载阶段会发生冲突。