c# - 使 C# 依赖项仅在新行插入到具有特定列值的 MS SQL 时触发

标签 c# sql-server dependencies

当新行插入到具有特定列值的 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

我怎样才能做到这一点?

最佳答案

使用 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 队列和许多其他队列技术。您可能会检查它们以及您的体系结构的选项。

关于c# - 使 C# 依赖项仅在新行插入到具有特定列值的 MS SQL 时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55353413/

相关文章:

sql - 如何从数据库中删除几乎相同记录的连续序列

sql - 连接小时和分钟列以十进制格式显示 SQL 查询

dependencies - 如何解决 SBT 依赖的依赖冲突?

rust - 二进制操作 == 不能应用于类型 syn::Path

java - 多模块java maven项目的标准结构

c# - 阅读 RapidShare API 响应的最佳方式?

SQL,试图摆脱大的 IN 子句

c# - 滚动到 C# DataGridView 的底部

c# - 如何在 C# 中添加 BouncyCaSTLeProvider?

c# - 数据标注中的错误信息如何本地化?