C# - 如何使用SqlDependency检测SQL Server的更改?

时间:2012-07-05 15:01:02

标签: c# sqldependency

我有一个应该等待数据库更改的Windows服务。

它看起来的数据库表如下所示:

  

Id [Guid]

     

姓名[text]

     

MatchId [Guid] =>这是一个外键

     

MatchDateTime [DateTime]

我希望我的服务能够在有人“清除”'MatchId'字段(为其指定NULL)时检测到,

然后对于'MatchId'字段中包含'NULL'的所有行 - 执行一些找到匹配项的算法并指定'MatchId'字段。

问题是 - 如果我使用'SqlDependency'类,并等待它在'MatchId'字段上触发 - 我只会在行受到影响时收到通知,但任何现有行都会收到通知'MatchId = NULL' - 我不知道。

这意味着如果Windows服务加载,并且表中已经有20行'MatchId = NULL',并且在接下来的5个小时内没有人会“清除”'MatchId'行 - 这意味着我不会知道现有的20行,也不会处理它们。

一个解决方案可能是在我设置'SqlDependency'之前 - 我应该快速执行'选择'以查看是否存在任何带有'MatchId = NULL'的现有行,如果是 - 处理它们,然后才设置依赖。

问题是 - 在完成处理这些行和设置SqlDependency之间的短暂间隔中 - 可能会发生一个事件,有人将一行更改为'MatchId = NULL',然后再次 - 我不会抓住它在SqlDependency。

知道如何解决这个问题吗?

(如果最坏的情况发生,我将不会使用SqlDependency,我只需要每隔XXX分钟轮询一次数据库......)

1 个答案:

答案 0 :(得分:1)

我明白,我对这个答案迟到了,但你没有更新SO,你选择哪种方法:)

您可以先启动SQLDependency,然后运行select query来检查现有记录。换句话说,每次SQLDependency启动后(最初或更改后),您都将轮询空记录

问题the answer

How to figure out which SQLDependency triggered change function?中提出了相同的方法
  

首先:必须在命令之前设置处理程序   执行。否则,通知可能会有一个窗口   丢失,你的回调从未被调用