【问题标题】:Sync Framework between SQL Server 2008 and SQL Server CESQL Server 2008 和 SQL Server CE 之间的同步框架
【发布时间】:2012-06-13 21:39:30
【问题描述】:

我正在使用一个包含大约 60,000 条记录的中等大小的数据库。我正在构建一个移动应用程序,它能够将单个表签出到一个紧凑的.sdf 上,以便在设备上查看和更改,然后允许用户将他们的更改与主服务器同步并接收任何新信息。

我已经使用 WCF 服务库通过 Sync Framework 对其进行了设置。出于某种原因设置连接时,数据库不会让我检查“使用 SQL Server 更改跟踪”并抛出错误:

"'无法初始化客户端数据库,因为 DbServerSyncProvider 的 GetSchema() 方法无法检索表 'Inventory' 的架构。请确保您可以 >建立与客户端数据库的连接,并且>SelectIncrementalInsertsCommand 属性或 >SyncAdapter 的 SelectIncrementalUpdatesCommand 属性指定正确。”

所以我没有选中它并将它设置为使用一些已经创建的列“AddDateTime”和“LastEditTime”,它似乎工作正常,经过大量调整后,我让它部分工作。设备上的更改与数据库完美同步,更新、删除,都得到应用。但是,服务器端的更改......永远不会更新。我已经确保一切都通过双向设置正确设置,所以这不应该是问题。而且,我让它坐了一夜,所以数据库收到了大约 500 条新记录,今天早上它实际上将最新的 24 个条目同步到了数据库中……从 500 条新记录中。所以这应该进一步证明它能够从服务器接收信息,但出于所有有用的目的,它不是。

我几乎尝试了所有方法,但老实说,我已经快要失去它了。如果有人有任何想法可以抛出,我可以追问,我将不胜感激。

我不确定我是否只需要返回并弄清楚为什么我不能使用“SQL Server 更改跟踪”来做到这一点。或者,如果有一个简单的解释来解释为什么它实际上没有将服务器上 99% 的更改同步回客户端。

此外,服务器数据库表架构无法更改,因为许多其他服务都在使用它。但是紧凑型数据库可以是任何需要的东西,只需要存储表并在两个方向上正确同步。

谢谢!!

快速概览:

  • 使用 WCF 并在没有 SQL Server 更改跟踪的情况下进行同步(在服务器和数据库上完全启用)
  • 将更改从客户端同步到服务器完美运行
  • 从服务器同步回客户端的次数不多:一夜之间有 500 个新条目,在同步时它下载了 24 个。

编辑:JuneT 让我想起了时间和他们的主播。当我今天早上同步时,它提取了大约 300 条新添加的记录中的 54 条。我进入了一行(大约有 60 列左右,所以为了便于阅读,我删除了它们,这是一个笑话)

this.SelectIncrementalUpdatesCommand.CommandText = @"SELECT [Value], [Value], [Value] FROM >TABLE WHERE ([LastEditDate] > @sync_last_received_anchor AND [LastEditDate] @sync_new_received_anchor AND [AddDateTime]

并将@sync_last_received_anchor 替换为两个不同的时间。同步后,它现在返回被困在这两者之间的行并取出中间的行给我:

this.SelectIncrementalUpdatesCommand.CommandText = @"SELECT[Value], [Value], [Value] FROM >TABLE WHERE ([LastEditDate] > '2012-06-13 01:03:07.470' AND [AddDateTime] 08:54:27.727')"; (注:第二个日期只是现在的时间)

虽然它返回的行数比最初计划的多几百行(将日期间隔设置为 600,但它返回的行数刚刚超过 800)。实际上,它确实将客户端与新的服务器更改同步。

谁能解释为什么我不能使用@sync_last_received_anchor 以及我应该寻找什么。我想我总是可以添加允许用户选择开始更新日期的框?或者可能添加某种 xml 文件来存储同步日期,该日期将在同步成功完成时更新?

谢谢!

编辑: 运行 SQL 探查器...日期(@sync_last_received_anchor)被设置为比实际时间提前 8 小时。我不知道它是如何或为什么这样做的,但这绝对是有道理的。

【问题讨论】:

  • 下载到客户端时是否检查过冲突/错误?如果您使用日期时间进行更改跟踪,服务器和客户端是否在同一时区?
  • 嗨 Wrightboy。我一直想在我的设备上使用本地 SQL CE 数据库并将更改推送到我们的服务器,但我从来没有弄清楚如何让它在代码中工作。您是在代码中执行此操作还是在使用某些SQL Server Change Tracking 应用程序?我见过的所有示例都严格显示TSQL 代码。这篇数据库期刊文章 [databasejournal.com/features/mssql/article.php/3875186/… 看起来不错。
  • JuneT,我实际上不知道如何检查冲突/错误,我想我一直认为如果确实有问题会引发错误。通过向 app.config 添加一些内容,我不断看到“启用跟踪”出现在网站上,但我还没有看到任何关于如何实现它的真正指南。 jp2code,这一切都是在使用同步框架的代码中完成的。由于某种原因,无法在该数据库上启用 SQL Server 更改跟踪(给出上述错误)。
  • jp2code,这里也是我用于初始设置的链接。遵循这些指南作为设置的基点。 Programming Microsoft Synchronization Services for ADO.NET (Devices)Building a Sync Services for ADO.NET Solution for Mobile Devices.

标签: compact-framework sql-server-ce sql-server-2008-r2 microsoft-sync-framework windows-mobile-6.5


【解决方案1】:

原来是这样收集锚点的:

this.SelectNewAnchorCommand.CommandText = "选择@sync_new_received_anchor = GETUTCDATE()";

那个 UTC 日期是造成 8 小时差距的原因。要修复它,请将其更改为 GETDATE(),或在命令的 WHERE 子句中将列转换为 UTC 时间。

【讨论】:

    【解决方案2】:

    在花了很多时间喝了很多杯咖啡之后,我想出了如何解决我的这个错误。当我在桌面测试区运行代码时,一切似乎都运行良好;但是,目标设备上的相同代码和 Web 服务反复出现此错误。然后,突然之间,紧凑型数据库表名上的“dbo_”前缀开始看起来很有趣,就像他们试图告诉我一些非常重要的事情一样。所以,我听过……

    Configuration.SyncTables.Add("Products);
    

    ClientSyncAgent.cs 上的应该改为

    Configuration.SyncTables.Add("dbo_Products");
    

    [执行]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-24
      • 2013-11-11
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多