我正在使用一个包含大约 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 小时。我不知道它是如何或为什么这样做的,但这绝对是有道理的。