1

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

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

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

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

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

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

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

谢谢!!

快速概览:

  • 在没有 SQL Server 更改跟踪的情况下使用 WCF 和同步(在服务器和数据库上完全启用)
  • 将更改从客户端同步到服务器完美运行
  • 从服务器同步回客户端并没有那么多:在一夜之间的 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)" ;

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

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

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

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

谢谢!

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

4

2 回答 2

0

原来锚是这样收集的:

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

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

于 2012-06-15T18:20:40.433 回答
0

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

Configuration.SyncTables.Add("Products);

在 ClientSyncAgent.cs 上应更改为

Configuration.SyncTables.Add("dbo_Products");

[下场]

于 2017-01-26T11:40:14.987 回答