3 回答
TA贡献2080条经验 获得超4个赞
using 的一般用例SqlDependency是检测您希望缓存的不经常更改的数据更改,但还需要知道它是否确实更改,以便您可以刷新缓存而无需轮询数据库。您的情况略有不同,因为您真的不想知道该查询的结果何时发生变化......您想知道某个查询何时包含要处理的结果。当状态代码从“NEW”更改为 AND 时您收到通知的原因是因为这两种类型的更改都会改变查询结果。它根据两种变化添加和减去整行。
如果您只使用状态代码“NEW”和“DONE”,并且保证它们始终启动为“NEW”并且只前进到“DONE”(并且永远不会返回),那么解决方法可能是使用此查询:
SELECT [OrderID] FROM [JJ].[Orders] WHERE [Status] <= 'NEW'
这样,在状态“NEW”中添加的新项目将更改查询结果......但是当它移动到“DONE”时,它仍然会OrderID在查询中返回,并且不应触发更改事件。如果你有更多的状态值,你会进步……你可以考虑在你的状态栏中使用一个整数来表示进步。例如 0 表示新的,1 表示进行中,2 完成...等。
听起来您正在尝试创建某种待完成的工作队列,并且还有其他方法可以执行此类操作。有 SQL Server 更改跟踪和数据更改跟踪、触发器、Service Broker 队列和许多其他队列技术。您可能会检查它们以及您的体系结构的选项。
TA贡献1780条经验 获得超5个赞
请问您为什么要在 c# 中为上下文重新发明 SQL 触发器? https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-2017
最简单的解决方案是在表本身捕获它,而不是通过会产生误报的查询。
或者,如果您通过存储库层运行所有代码,那么您应该能够将 INSERT 与 UPDATE 区分开来,并从那里选择它。
TA贡献1868条经验 获得超4个赞
我认为只要表中有任何插入/更新/删除,就会触发 SqlDependency 事件。
没有办法阻止它。
您可以在事件中捕获适当的通知类型并开始工作。
void OnDependencyChange(object sender,
SqlNotificationEventArgs e)
{
if (e.Info == SqlNotificationInfo.Insert)
}
我没有尝试过的其他方式,
创建另一个表OrdersCopy ,它是[JJ].[Orders]
在订单表中创建插入触发器。
只要在 Order 表中有插入,触发器就会触发。将新记录插入OrdersCopy
这里做如下改动,把表名改成OrderCopy
string sqlCommandText = "SELECT [Symbol] FROM [JJ].[OrdersCopy] WHERE [Status] = 'NEW'";
对于实验摇晃,您可以尝试一次。
OnDependencyChange事件只会在插入的情况下触发。
- 3 回答
- 0 关注
- 221 浏览
添加回答
举报
