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

本文关键字:对象 跟踪 框架 同步 为什么 | 更新日期: 2023-09-27 18:31:57

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

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

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

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

耦合更改跟踪

意味着更改跟踪元数据 插入和更新存储在基表中,带有逻辑删除 用于跟踪删除的表。 分离的更改跟踪意味着元数据 用于插入、更新和删除存储在单独的表中 (通常每个基表一个表)

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

在这里,您使用的是 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 文档启用和禁用更改跟踪 (SQL Server) 的有用链接

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

Alter database 'DATABASENAME'
set CHANGE_TRACKING =ON
go
ALTER TABLE 'TableName'
ENABLE CHANGE_TRACKING

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