【问题标题】:SQL Server built-in Change Tracking vs Sync Framework's C#/VB librariesSQL Server 内置更改跟踪与同步框架的 C#/VB 库
【发布时间】:2012-11-08 19:05:35
【问题描述】:

我遇到了一个问题,在 Windows XP 32 位/SQL Server Express 上的已恢复数据库上,使用以下代码未更改我的数据库中 Sync Framework 2.1 元素的副本键映射和 scope_info 表中的 scope_id 值2008 (x86)。它确实适用于我的其他客户端,即 Windows 7 64 位/SQL Server Express 2008 (x86):

SqlSyncStoreRestore databaseRestore = new SqlSyncStoreRestore(clientConn); databaseRestore.PerformPostRestoreFixup();

子问题 1: 它不起作用,但也不会引发任何异常,这使得故障排除变得更加困难。它是从我在我的 x64 计算机(使用 Visual Studio x86)上构建的一个小型控制台应用程序(目标 x86)执行的。我想知道 32/64 位的东西是否是罪魁祸首。有什么线索吗??但是,这让我想知道:

子问题 2: “是否有相当于使用 Sync Framework 的 C# 的 PerformPostRestoreFixup() 的 SQL 查询?”

我是 Sync Framework 的新手,我还没有完全了解 Microsoft SQL Server 数据库同步的全貌。我注意到 SyncOrchestrator/SqlSyncProvider 组合不使用内置的 SQL 更改跟踪内容。令我难以置信的惊喜!它现在让我被一个更折磨人的问题困扰:

子问题 3: 内置的 SQL Server Change Tracking 和 Sync Framework 是两个完全独立的平台来构建我们的同步方案吗?我希望我在英语中使用了正确的单词。换句话说,他们每个人都完全不知道对方吗??

提前感谢您的帮助!我迷路了哈哈!

亲切的问候,

Zyxy

【问题讨论】:

    标签: c# sql-server-2008 microsoft-sync-framework


    【解决方案1】:

    问题 1 - 您是否尝试过启用同步 fx 跟踪?

    VS Project Properties->Build Tab 下的 Platform Target 应该与安装的 Sync Fx 平台匹配。例如,x86 Platform Target 应该有 Sync Fx x86

    如果 x86/x64 事物不匹配,通常会引发 COM 异常。

    问题 2 - 您可以运行 SQL Profiler 来查看 PerformPostRestoreFixup 是什么。但我会坚持使用框架来执行此操作,因为这涉及到一些同步元数据处理。

    问题 3 - SQL 更改跟踪只是更改跟踪。您仍然需要一个同步应用程序才能使用它。

    SQL CT 跟踪已更改的内容并允许您查询已更改的内容。它本身并不是一个同步平台。

    您需要一个同步应用程序来查询它,就像 Sync Fx 一样。或者您可以手动编写自己的 SQL 查询来查询更改。

    Sync Fx 较旧的 SQLCeClientSyncProvider/DBServerSyncProvider/Sync Agent(本地数据库缓存项目项中使用的那个)可以使用 SQL CT。

    【讨论】:

    • 一如既往,感谢您的快速回复。只是为了确保我正确解释您的答案,Sync Fx(与 Orchestrator 等)构建并使用 ITS OWN 更改跟踪数据库对象(存储过程、表、触发器......),并且不以任何方式关心 SQL CT。对?对于问题 1,是的,我确实启用了 Sync Fx 跟踪。当我运行 PerformPostRestoreFixup() 时,日志中没有显示任何内容,scope_id 没有更新,但没有错误(我也检查了 SQL Express 日志,但什么也没有。看起来这是一个“容忍”的事件,它会静默,比如例如,当数据被截断时......
    • LOL 在 SQL 日志中看到的唯一内容:“服务器在空闲 455 秒后恢复执行:用户活动唤醒了服务器。这只是一条信息性消息。不需要用户操作。” ... ...我刚刚意识到我在我的同步应用程序中启用了同步跟踪,而不是我的控制台应用程序用于配置数据库以进行同步。我会让你知道里面有什么!谢谢!!
    • 正如我所提到的,如果您使用的是 SqlSyncProvider,则不使用 SQL CT。
    • 您好 JuneT,我实际上是想弄清楚如何将信息输出到 .log 文件中,就像我对 Web 应用程序所做的那样。在这个 web 应用程序中,很容易在 web.config 文件中配置 TraceListener,并在同步代码中使用这一简单行填充日志: SyncOperationStatistics syncStats = this.Synchronize();但是我不能执行以下操作,因为它说它不能隐式转换类型“void”:SyncOperationStatistics syncStats = databaseRestore.PerformPostRestoreFixup();嗯……
    【解决方案2】:

    更新:为什么它没有改变值但也没有抛出异常?以下是最有可能的解释。它并没有完全回答为什么 scope_id 没有得到更新的问题,但它确实提供了额外的提示:

    PerformPostRestoreFixup() 适用于数据库中的所有范围。我在数据库中定义了另一个(有效)范围,该范围已成功更改其 scope_id 值。但是,我的第二个范围(我无法更改 scope_id 的范围)存储在另一个模式中(不是默认的 .dbo)。我猜它只是没有看到范围,或者认为它无效,因此没有通知我。我尝试取消配置第二个范围并收到以下错误:


    在表“[scope_info]”中找不到名为“syncScope”的有效范围。确保此范围存在并且在配置表“[scope_config]”中具有相应的有效配置。

    所以这两个问题可能具有相同的根本原因。

    第二个作用域确实存在,我可以用 select 语句查看那个该死的作用域 ID。现在我怎么知道配置是否有效?为什么恢复成功后会突然失效?我认为它缩小了范围,但对我来说还不够,呵呵 ;-) 我会继续发布我的发现和解决方案,以防有人大笑!开个玩笑,但有一天谁知道它可能会帮助(或混淆)谁,这取决于我猜当天的心情;-) 干杯!

    【讨论】:

    • 更新:scope_status = C 对于两个范围:[dbo].[scope_config] 和 [syncSchema].[scope_config]
    • 此外,它确实在我进行完整备份的另一个客户端上同步。但是,我显然不想在更改其副本 ID 之前在新客户端上尝试同步,因为担心副本会在同步的数据和元数据中产生不一致。考虑到这一点,我想我在尝试更改 scope_id/replicaID 之前无意中同步了一次。它会对作用域本身的结构造成任何损害吗?
    • 取消配置代码相对简单(这种形式的代码适用于位于 dbo 架构中的更简单的范围:3 C# 行(用“;”分隔):SqlSyncScopeDeprovisioning sqlDeprovision = new SqlSyncScopeDeprovisioning(sqlConn) ; sqlDeprovision.ObjectSchema = "syncSchema"; sqlDeprovision.DeprovisionScope("syncScope"); 很可能与这个 WELL KNOWN BUG 密切相关:social.msdn.microsoft.com/Forums/is/synclab/thread/…
    【解决方案3】:

    好的,感谢 JuneT 将我指向 Sync Fx 2.1 SDK 的文档(在这里或者我在另一个讨论线程上阅读它?),我意识到我有一个属性我还没有尝试过。在线阅读 Sync Fx 2.0(和其他?)在非 dbo 模式和多范围数据库方面存在问题,我想我会尝试一下。只需在我的控制台应用程序中添加以下 C# 行即可解决!

    databaseRestore.ObjectSchema = "syncSchemaName";

    JuneT 的许多人最终都向我指出了一些好的阅读材料,因此我会将其标记为答案。非常感谢!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多