如何获取整个数据库的MD5并使用它来轮询更改?

时间:2012-08-16 12:17:34

标签: c# sql-server linq-to-sql

我正在尝试进行某种轮询以侦听数据库中发生的更新。到目前为止,我正在考虑获取数据库(或几个表)的MD5哈希(或任何类型或哈希),将其存储在变量中,并运行一遍又一遍地循环此过程的线程,将其与上一结果进行比较。如果它们不同,则将一个按钮设置为Enabled,这会分组数据库加载功能。

这是一个很好的方法吗?如果没有,为什么?如果是,怎么样?

我不知道如何实现的部分是在数据库一侧获取MD5哈希值。我可以很容易地获得所有数据然后得到它的md5哈希,所有客户端,但是......是的。

我正在使用LINQ to SQL,但我担心我只能使用上下文来运行Raw查询。这是在WinForms,.NET 3.5上(不过它应该重要......)。

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

2 个答案:

答案 0 :(得分:6)

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

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

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

  •     
  

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

答案 1 :(得分:1)

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

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