启用查询通知

下载 ADO.NET

使用查询通知的应用程序具有一组通用的要求。 必须正确配置数据源才能支持 SQL 查询通知,并且用户必须具有正确的客户端和服务器端权限。

若要使用查询通知,必须:

  • 为数据库启用查询通知。
  • 确保用于连接数据库的用户 ID 具有所需的权限。
  • 使用 SqlCommand 对象与关联的通知对象(SqlDependencySqlNotificationRequest)一起执行有效的 SELECT 语句。
  • 如果要监视的数据发生更改,请提供代码以处理通知。

查询通知要求

只有满足下列特定要求的 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 数据库权限。

在部分信任情况下运行的客户端代码需要 SqlClientPermission

以下代码创建 SqlClientPermission 对象,并将 PermissionState 设置为 Unrestricted。 如果未对调用堆栈中处于较高位置的所有调用方授予权限,Demand 会在运行时强制执行 SecurityException

using Microsoft.Data.SqlClient;
using System.Security.Permissions;

class Program
{
    static void Main()
    {
    }

    // Code requires directives to
    // System.Security.Permissions and
    // Microsoft.Data.SqlClient

    private bool CanRequestNotifications()
    {
        SqlClientPermission permission =
            new SqlClientPermission(
            PermissionState.Unrestricted);
        try
        {
            permission.Demand();
            return true;
        }
        catch (System.Exception)
        {
            return false;
        }
    }
}

选择通知对象

查询通知 API 提供两个用于处理通知的对象:SqlDependencySqlNotificationRequest

使用 SqlDependency

要使用 SqlDependency,必须对所使用的 SQL Server 数据库启用 Service Broker,并且用户必须具有接收通知的权限。 Service Broker 对象(如通知队列)是预定义的。

此外,在将通知发布到队列中时,SqlDependency 将自动启动工作线程以处理通知。 它还会分析 Service Broker 消息,将信息公开为事件参数数据。 必须通过调用 Start 方法建立对数据库的依赖关系,从而初始化 SqlDependencyStart 是一个静态方法,对于每个所需的数据库连接,在应用程序初始化期间仅需调用一次。 必须在应用程序终止时为执行的每个相关连接调用 Stop 方法。

使用 SqlNotificationRequest

与此相反,SqlNotificationRequest 要求你自己实现整个侦听基础结构。 此外,必须定义队列所支持的所有支持 Service Broker 对象,例如队列、服务和消息类型。 如果你的应用程序需要特殊通知消息或通知行为,或者你的应用程序是较大的 Service Broker 应用程序的一部分,则此手动方法非常有用。

后续步骤