65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C# 的高级 SQL 2005 SQLNotificationRequest 功能

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.08/5 (13投票s)

2007年3月24日

CPOL

2分钟阅读

viewsIcon

81442

downloadIcon

2230

使用 SQLNotificationRequest 对象和 Service Broker 获取行和列更改通知,模拟所谓的 SQLDependency 功能

引言

SQL Server 2005 和 ADO.NET 2.0 承诺通过 SQLDependency 对象实现强大的数据库更改通知。虽然 SQL 2000 只能在表级别通知客户端应用程序更改,但 SQL 2005 承诺能够在查询级别通知更改。如果数据库表的更改影响了提供给 SQL 2005 的查询,则会向客户端应用程序发出通知。 如果更改的数据不影响提供给 SQL 2005 的查询,则不会发出通知。

任何尝试使用 SQLDependency 对象的人都会发现,此功能实际上并不存在。 无论向 SQL 2005 提供什么查询来检查,通知仍然只在表级别。 在这里,我提供了一种使用 SQL 2005 触发器和 TSQL Service Broker 对话来向客户端应用程序发送通知的解决方法。

Using the Code

只需解压缩附加的代码,运行 SQL 脚本,然后运行 C# 应用程序。 更改 SQLNotificationRequestTable (update, insert, delete),并在 C# 窗体上查看报告的更改...

本文的 C# 部分取自 此 MSDN 页面,进行了一些细微的修改和一个大的修改:代码中有一个位置可以将通知作为 SQLDataReader 处理并检查消息。 我使用此功能来获取消息并显示它们。

一旦我了解了 Service Broker 和 TSQL 触发器的工作原理,本文的 SQL 部分就是我自己编写的。 Service Broker 是一个复杂的概念,我很高兴能够真正让我的消息工作。 我探索的另一个途径是 Microsoft.SQLServer.Samples 命名空间,它有一些用于 Service Broker 的 C# 类,但我实际上在使用这些类时遇到了死胡同。 如果您非常了解 Service Broker,可能会有更好的方法来做到这一点。

SQL 的大部分内容都用于检查插入和删除的表,以确定是什么触发了触发器。 插入或删除的表的内容被复制到 string 变量中,然后插入到 XML 变量中,因为此 Service Broker 消息需要格式良好的 XML。 然后,在 SQL 的最后一部分,我发送消息。

关注点

我从未尝试过,但根据文档,客户端和数据库可以是单独的计算机,并且在创建 Service Broker 路由时,客户端应用程序的 IP 地址将替换附加的 SQL 脚本中的“LocalHost”。 如果有人尝试过,很乐意听到回复。

我也不知道这在生产质量方面如何,而且我还没有在多个表上尝试过。

我试图将代码片段复制到这篇文章中,但格式不会起作用,因此请参考下载。

历史

  • 2007 年 3 月 24 日:初始发布
© . All rights reserved.