语言
若要使用查询通知,请将数据库配置为支持它们,并向数据库主体授予所需的权限。
若要使用查询通知,必须:
为数据库启用查询通知。
确保用于连接数据库的用户 ID 具有所需的权限。
使用 SqlCommand 执行一条有效的
SELECT语句,附带一个关联的 SqlDependency 或 SqlNotificationRequest 对象。如果要监视的数据发生更改,请提供代码以处理通知。
查询通知需求
只有满足特定要求列表的 SELECT 语句才支持查询通知。 下表提供了 SQL Server 文档中 Service Broker 和查询通知文档的链接。
SQL Server 文档
启用查询通知以运行示例代码
若要使用 SQL Server Management Studio 在 AdventureWorks 数据库上启用 Service Broker,请执行以下 Transact-SQL 语句:
ALTER DATABASE AdventureWorks SET ENABLE_BROKER;
为了使查询通知示例正确运行,必须在数据库服务器上执行以下 Transact-SQL 语句。
CREATE QUEUE ContactChangeMessages;
CREATE SERVICE ContactChangeNotifications
ON QUEUE ContactChangeMessages
([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);
查询通知权限
向数据库主体 SUBSCRIBE QUERY NOTIFICATIONS 和 Service Broker 授予队列配置所需的权限。 例如,将占位符替换为现有数据库用户:
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO [<database_user>];
现代 .NET 不支持代码访问安全(CAS)。 不要使用 SqlClientPermission.Demand 来授权查询通知;请改为配置数据库权限。
选择通知对象
查询通知支持提供两个对象来处理通知: SqlDependency 和 SqlNotificationRequest。 使用 SqlDependency 接收更改事件并使应用程序的缓存失效。 需要实现自己的通知侦听器时使用 SqlNotificationRequest 。
Important
请勿将 System.Data.SqlClient 用于新的开发。 请改用 Microsoft.Data.SqlClient。 ASP.NET Framework SqlCacheDependency 类需要 System.Data.SqlClient,且不与 Microsoft.Data.SqlClient 集成。 对于新的 Microsoft.Data.SqlClient 应用程序,请处理 SqlDependency.OnChange,并通过应用程序的缓存 API 更新缓存。
使用 SqlDependency
要使用 SqlDependency,必须对所使用的 SQL Server 数据库启用 Service Broker,并且用户必须具有接收通知的权限。 Service Broker 对象(如通知队列)是预定义的。
此外, SqlDependency 自动启动工作线程以在通知发布到队列时处理通知;它还分析 Service Broker 消息,将信息公开为事件参数数据。 必须通过调用 SqlDependency 方法建立对数据库的依赖关系,从而初始化 Start。 这是一种静态方法,需要在应用程序初始化期间仅调用一次所需的每个数据库连接。 必须在应用程序终止时为执行的每个相关连接调用 Stop 方法。
使用 SqlNotificationRequest
与此相反,SqlNotificationRequest 要求你自己实现整个侦听基础结构。 此外,必须定义队列支持的所有 Service Broker 对象,例如队列、服务和消息类型。 如果你的应用程序需要特殊通知消息或通知行为,或者你的应用程序是较大的 Service Broker 应用程序的一部分,则此手动方法非常有用。