0

我正在尝试进行某种轮询以收听数据库上发生的更新。到目前为止,我正在考虑获取数据库(或几个表)的 MD5 散列(或任何类型或散列),将其存储在一个变量中,然后运行一个线程,一遍又一遍地循环这个过程,将它与最后的结果进行比较。如果有不同,则将一个按钮设置为“启用”,该按钮会触发数据库加载功能。

这是一个好方法吗?如果不是,为什么?如果是,如何?

我真的不知道如何实现的部分是在数据库一侧获取 MD5 哈希。我可以轻松获取所有数据,然后获取它的 md5 哈希,所有客户端,但是......是的。

我正在使用 LINQ to SQL,但恐怕我只能使用上下文来运行原始查询。这是在 WinForms、.NET 3.5 上(但这并不重要……)。

非常感谢任何提示。谢谢!

4

2 回答 2

6

不要重新发明轮子。为工作使用正确的工具:

  • 更改跟踪SQL Server 2008 中的更改跟踪使应用程序能够仅获取对用户表所做的更改以及有关这些更改的信息

  • 更改数据捕获更改数据捕获旨在捕获应用于 SQL Server 表的插入、更新和删除活动,并以易于使用的关系格式提供更改的详细信息。变更数据捕获使用的变更表包含反映跟踪源表的列结构的列,以及了解已发生的变更所需的元数据。

请注意,上述两种技术都针对偶尔连接的系统(例如,移动用户连接到棒以刷新其本地快照)。对于永久连接并需要在后端发生更改时刷新其显示的系统,正确的技术是查询通知

于 2012-08-16T12:25:07.480 回答
1

通过轮询所有数据来检测对数据库的修改几乎是最糟糕的想法。如果您无法控制进行实际修改的客户端,那么 AFAIK 就没有理智的方法可以做到这一点(如果您的应用程序需要这种级别的信息,每个人都应该合作)。

作为一种听起来仍然很糟糕的解决方法,您可以rowversion通过选择最大值并将其与本地缓存的“旧最大值”进行比较,为所有表和每个表轮询添加一列。每当更新一行时,它rowversion就会发生变化,因此您不仅会知道某些内容已更新,而且如果需要,您还可以从表中仅选择更新的记录。

于 2012-08-16T12:25:54.280 回答