本地数据缓存 - 如何强制与数据库完全同步?

时间:2009-10-30 21:35:37

标签: c#-3.0 microsoft-sync-framework syncservices

我的asp.net 3.5应用程序中有一个本地数据缓存。我偶尔会注意到,特别是在开发时我的本地数据库与服务器不同步。我理解为什么,我可以通过以下步骤重现它:

1- Start the app
2- Make a change
3- Sync changes with server
4- Start the app again, thus forcing the app to use a new copy of 
the local .SDF file.

我之前做出的更改显然已经消失,但是当我与服务器同步时,它们不会被拉下来。我的猜测是应用程序没有检测到数据库不同步。

我很奇怪是否有办法以编程方式告诉我的应用程序与服务器完全同步。有人知道吗?

3 个答案:

答案 0 :(得分:1)

我在Microsoft论坛中获得的answer可以为您的问题提供解决方案。

如果通过将主键设置为自身来更新有问题的表,则记录的版本将递增,并且它们将包含在下一次同步中。您可以使用类似于以下内容的SQL语句来执行此操作。

update MyTable set Id = Id;

请注意,您的方案存在一些差异。

  1. 您将按照我的情况递增版本而不是初始化。
  2. 您将在服务器上而不是在Compact Edition数据库中操作更改跟踪。
  3. 如果没有经过测试,我认为这个解决方案应该对你有用 - 让我们知道你是如何进行的!

答案 1 :(得分:0)

正如我在评论中提到的,我不确定为什么你的本地数据库会被频繁覆盖,但是如果它被覆盖了,并且没有重新同步以前发送到服务器的更改,那么问题很可能是锚点存储在服务器上。即使客户端数据库已“回滚”到以前的版本,服务器也不会意识到这一点,实际上无法找到它。

当然,这完全取决于个人如何实际实现同步和锚定逻辑,因此我只能猜测问题的细节,但为了解决它,你需要做两件事之一:

  • 让您在服务器上运行的脚本重置您使用的开发客户端ID的客户端锚点;或
  • 将项目中SDF的构建副本属性(“复制到输出目录”)更改为“不复制”,以便本地数据库永远不会被覆盖。

希望有所帮助。

答案 2 :(得分:0)

如果SQL Services中的Track Changes Interval选项太小,您也会错过更新。

e.g。如果设置为2天,则发生更改,然后在同步尝试前3天,您将错过这些更改。

虽然通过如上所述更改记录来确保更新,但我发现对我来说最好的方法是将每个同步表的最后同步日期存储在单独的同步表中,并且每次都完全下载该表。

然后允许同步发生。

然后,对于未通过同步更新的每个表,请检查日期是否超过Track Changes间隔时间。如果是,请更改该表的同步选项以完成下载并再次同步。

有点太疯狂了,我知道......