为什么在同步框架中对象跟踪?

时间:2013-09-19 19:12:31

标签: c# sql-server synchronization sql-server-ce microsoft-sync-framework

我正在使用同步框架来同步两个数据库。创建同步设计器文件的标准过程是,使用数据源配置向导选择表。我创建了.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. 我们如何在不依赖的情况下在C#代码中启用此对象跟踪 在设计师?

2 个答案:

答案 0 :(得分:2)

为了执行同步,MSF需要跟踪数据库中的更改(更新/删除/插入)。如果不知道这些更改,则无法同步

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

  

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

     

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

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

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

可以使用SQL Server Management Studio(数据库属性&gt;更改跟踪或表属性&gt;更改跟踪)或脚本来完成此操作:

对于数据库:

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)

的有用链接

答案 1 :(得分:0)

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

Alter database 'DATABASENAME'
set CHANGE_TRACKING =ON

go

ALTER TABLE 'TableName'
ENABLE CHANGE_TRACKING

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