为什么在同步框架中对象跟踪
本文关键字:对象 跟踪 框架 同步 为什么 | 更新日期: 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。
所以我的问题是
- 为什么必须启用此对象跟踪?
- 我们如何在 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
但我的第一个问题仍然存在。为什么这个对象跟踪对同步框架是无效的?