仅当具有特定列值的新行插入到 MS SQL 中时才触发 C# 依赖关系

当使用特定列值将新行插入到 MS SQL 中时,我想收到一个“更改”事件。


下面是我目前使用的代码,它工作得很好,除了它会在 [Status] 列中的任何行值更改为/或从“NEW”时触发一个事件。


public void InitialiseDependencyWORK(Action onDependencyMethod)

{


    this.onDependencyMethod = onDependencyMethod;


    string sqlCommandText = "SELECT [Symbol] FROM [JJ].[Orders] WHERE [Status] = 'NEW'";


    using (SqlCommand command = new SqlCommand(sqlCommandText, conn))

    {


        Dependency = new SqlDependency(command);


        Dependency.OnChange += new OnChangeEventHandler(OnDependencyChange);


        using (SqlDataReader reader = command.ExecuteReader())

        {

            // Process the DataReader.

        }

    }


}


void OnDependencyChange(object sender,

   SqlNotificationEventArgs e)

{

    // Handles NEW rows

}

我只对使用 [Status] = "NEW" 插入新行感兴趣,但是当没有新插入但 [Status] 已从“NEW”更改为其他任何内容时,此事件也会触发。


如何只有在有新的插入时才得到触发事件?


我想在插入新闻行时收到触发事件,如下面的第 2 行:


OrderID, Status 

1,Done 

2,NEW 

我不希望它触发,因为第 2 行刚刚更新了其状态 - 实际上没有要处理的新行:


OrderID, Status

1,Done

2,Done

我怎样才能做到这一点?


繁花不似锦
浏览 223回答 3
3回答

犯罪嫌疑人X

using 的一般用例SqlDependency是检测您希望缓存的不经常更改的数据更改,但还需要知道它是否确实更改,以便您可以刷新缓存而无需轮询数据库。您的情况略有不同,因为您真的不想知道该查询的结果何时发生变化......您想知道某个查询何时包含要处理的结果。当状态代码从“NEW”更改为 AND 时您收到通知的原因是因为这两种类型的更改都会改变查询结果。它根据两种变化添加和减去整行。如果您只使用状态代码“NEW”和“DONE”,并且保证它们始终启动为“NEW”并且只前进到“DONE”(并且永远不会返回),那么解决方法可能是使用此查询:SELECT&nbsp;[OrderID]&nbsp;FROM&nbsp;[JJ].[Orders]&nbsp;WHERE&nbsp;[Status]&nbsp;<=&nbsp;'NEW'这样,在状态“NEW”中添加的新项目将更改查询结果......但是当它移动到“DONE”时,它仍然会OrderID在查询中返回,并且不应触发更改事件。如果你有更多的状态值,你会进步……你可以考虑在你的状态栏中使用一个整数来表示进步。例如 0 表示新的,1 表示进行中,2 完成...等。听起来您正在尝试创建某种待完成的工作队列,并且还有其他方法可以执行此类操作。有 SQL Server 更改跟踪和数据更改跟踪、触发器、Service Broker 队列和许多其他队列技术。您可能会检查它们以及您的体系结构的选项。

翻阅古今

请问您为什么要在 c# 中为上下文重新发明 SQL 触发器?&nbsp;https://learn.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-2017最简单的解决方案是在表本身捕获它,而不是通过会产生误报的查询。或者,如果您通过存储库层运行所有代码,那么您应该能够将 INSERT 与 UPDATE 区分开来,并从那里选择它。

MYYA

我认为只要表中有任何插入/更新/删除,就会触发 SqlDependency 事件。没有办法阻止它。您可以在事件中捕获适当的通知类型并开始工作。void OnDependencyChange(object sender,&nbsp; &nbsp;SqlNotificationEventArgs e){&nbsp; &nbsp; if (e.Info == SqlNotificationInfo.Insert)}我没有尝试过的其他方式,创建另一个表OrdersCopy ,它是[JJ].[Orders]在订单表中创建插入触发器。只要在 Order 表中有插入,触发器就会触发。将新记录插入OrdersCopy这里做如下改动,把表名改成OrderCopystring sqlCommandText = "SELECT [Symbol] FROM [JJ].[OrdersCopy] WHERE [Status] = 'NEW'";对于实验摇晃,您可以尝试一次。OnDependencyChange事件只会在插入的情况下触发。
打开App,查看更多内容
随时随地看视频慕课网APP