1

我正在使用同步框架来同步两个数据库。创建同步设计器文件的标准过程是,使用数据源配置向导选择表。我创建了 .sync 文件和 SDF 文件。但是,当我与目标数据库同步时,以下代码会发生异常:

var syncDataServerSyncProvider =
new SyncDataServerSyncProvider(
ConfigurationManager.ConnectionStrings["ConnectionString"].
            ConnectionString);
var syncAgent = new SyncDataSyncAgent();
syncAgent.LocalProvider = syncDataClientSyncProvider;
syncAgent.RemoteProvider = syncDataServerSyncProvider;

syncDataClientSyncProvider.SyncProgress += new    EventHandler<SyncProgressEventArgs>(ShowClientProgress);
syncDataClientSyncProvider.ApplyChangeFailed += new EventHandler<ApplyChangeFailedEventArgs>(ShowFailures);

SyncStatistics syncStats = syncAgent.Synchronize();//Exception happen here

例外是:

System.Data.SqlClient.SqlException :无法初始化客户端数据库,因为 DbServerSyncProvider 的 GetSchema() 方法无法检索表“表名”的架构

内部例外是:

未对表“表名”启用更改跟踪

可以通过使用数据源配置向导从目标数据库中为同步设计器选择表来解决此异常。我们可以在此向导中启用更改跟踪。但实际上,在部署场景中,我们不能使用设计器文件,因为我们不能使用 Visual Studio。

所以我的问题是

  1. 为什么必须启用此对象跟踪?
  2. 我们如何在不依赖 Designer 的情况下在 C# 代码中启用此对象跟踪?
4

2 回答 2

2

为了执行同步,MSF 需要跟踪数据库中的更改(更新/删除/插入)。如果不知道这些变化,就不可能进行同步。

请注意,更改跟踪可以耦合解耦

耦合更改跟踪意味着插入和更新的更改跟踪元数据存储在基表中,并使用墓碑表来跟踪删除。解耦更改跟踪意味着插入、更新和删除的元数据存储在单独的表中(通常每个基表一个表)

对于任何一种更改跟踪,您为 DbSyncAdapter 对象指定的命令使用更改跟踪元数据来确定在每个对等方所做的增量更改。

在这里,您使用的是 SQL Server 中包含的耦合更改跟踪选项(自 SQL Server 2008 起可用)。正如您所说,您必须在数据库中启用更改跟踪:

  • 首先在数据库级别
  • 然后在表级别(对于所有需要同步的表)

这可以通过 SQL Server Management Studio(数据库属性 > 更改跟踪或表属性 > 更改跟踪)或脚本来完成:

对于数据库:

ALTER DATABASE [DatabaseName] SET CHANGE_TRACKING = ON 

对于表:

ALTER TABLE [TableName] ENABLE CHANGE_TRACKING 

您需要根据需要自定义的一个重要事项是这些更改的保留期(默认为 2 天):

更改保留值指定保留更改跟踪信息的时间段。比此时间段更早的更改跟踪信息会定期删除。设置此值时,应考虑应用程序与数据库中的表同步的频率。指定的保留期必须至少与同步之间的最长时间一样长。如果应用程序以较长的时间间隔获取更改,则返回的结果可能不正确,因为某些更改信息可能已被删除。

具有自定义周期并禁用自动清理的示例查询:

ALTER DATABASE [TableName] 
  SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 90 MINUTES, AUTO_CLEANUP = OFF)

以及来自 Sql Server 文档的有用链接Enable and Disable Change Tracking (SQL Server)

于 2013-09-19T22:00:31.440 回答
0

问题现在解决了。我通过运行以下查询在 SQL Server 中启用了对象跟踪

Alter database 'DATABASENAME'
set CHANGE_TRACKING =ON

go

ALTER TABLE 'TableName'
ENABLE CHANGE_TRACKING

但是我的第一个问题仍然存在。为什么这个对象跟踪对于同步框架很重要?

于 2013-09-19T20:37:44.720 回答