我有一个应该等待数据库更改的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分钟轮询一次数据库......)
答案 0 :(得分:1)
我明白,我对这个答案迟到了,但你没有更新SO,你选择哪种方法:)
您可以先启动SQLDependency,然后运行select query来检查现有记录。换句话说,每次SQLDependency启动后(最初或更改后),您都将轮询空记录
How to figure out which SQLDependency triggered change function?中提出了相同的方法首先:必须在命令之前设置处理程序 执行。否则,通知可能会有一个窗口 丢失,你的回调从未被调用