gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:42:37 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com