启用查询通知 (ADO.NET)
更新:November 2007
使用查询通知的应用程序有一组通用的要求。必须正确配置数据源才能支持 SQL 查询通知,并且用户必须具有正确的客户端和服务器端权限。
要使用查询通知,必须符合下列条件:
使用 SQL Server 2005 或 SQL Server 2008。
对数据库启用查询通知。
确保用于连接数据库的用户 ID 具有必要的权限。
使用 SqlCommand 对象执行有效的 SELECT 语句,包含关联的通知对象 — SqlDependency 或 SqlNotificationRequest。
提供所监视的数据更改时用于处理通知的代码。
查询通知要求
仅对满足一系列特定要求的 SELECT 语句支持查询通知。下表提供指向“SQL Server 联机丛书”中的 Service Broker 和“查询通知”文档的链接。
SQL Server 2005 联机丛书 |
SQL Server 2008 联机丛书 |
---|---|
启用查询通知运行示例代码
若要通过使用 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
([https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);
查询通知权限
执行请求通知的命令的用户必须在服务器上具有 SUBSCRIBE QUERY NOTIFICATIONS 数据库权限。
在部分信任情况下运行的客户端代码要求 SqlClientPermission。
下面的代码创建一个 SqlClientPermission 对象,将 PermissionState 设置为 Unrestricted。如果尚未为调用堆栈中的所有高级调用方授予该权限,则 Demand 将在运行时强制引发 SecurityException。
' Code requires directives to
' System.Security.Permissions and
' System.Data.SqlClient
Private Function CanRequestNotifications() As Boolean
Dim permission As New SqlClientPermission( _
PermissionState.Unrestricted)
Try
permission.Demand()
Return True
Catch ex As Exception
Return False
End Try
End Function
// Code requires directives to
// System.Security.Permissions and
// System.Data.SqlClient
private bool CanRequestNotifications()
{
SqlClientPermission permission =
new SqlClientPermission(
PermissionState.Unrestricted);
try
{
permission.Demand();
return true;
}
catch (System.Exception)
{
return false;
}
}
选择通知对象
查询通知 API 提供两个用于处理通知的对象:SqlDependency 和 SqlNotificationRequest。通常情况下,大多数非 ASP.NET 应用程序应使用 SqlDependency 对象。ASP.NET 应用程序应使用更高级别的 SqlCacheDependency,以便包装 SqlDependency 并为管理通知和缓存对象提供框架。
使用 SqlDependency
要使用 SqlDependency,必须对所使用的 SQL Server 数据库启用 Service Broker,并且用户必须具有接收通知的权限。Service Broker 对象(例如通知队列)已预定义。
此外,SqlDependency 会自动启动一个辅助线程以在通知发布到队列中时处理这些通知;它还会分析 Service Broker 消息,将此信息作为事件参数数据公开。必须通过调用 Start 方法初始化 SqlDependency,以建立与数据库的相关性。此方法是静态方法,在为每个所需的数据库连接初始化应用程序期间只需调用一次。必须在应用程序终止时为执行的每个相关连接调用 Stop 方法。
使用 SqlNotificationRequest
相对而言,SqlNotificationRequest 要求您自己实现整个侦听基础结构。此外,必须定义队列所支持的所有支持 Service Broker 对象(例如队列、服务和消息类型)。如果应用程序要求特殊的通知消息或通知行为,或应用程序是更大的服务中介应用程序的一部分,此手动方法非常有用。