取用查詢通知的應用程式有一組常見的需求。 您的數據源必須正確設定為支援 SQL 查詢通知,而且用戶必須具有正確的客戶端和伺服器端許可權。
若要使用查詢通知,您必須:
啟用資料庫的查詢通知。
請確定用來連線到資料庫的使用者標識碼具有必要的許可權。
使用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 資料庫許可權。
在部分信任情況下執行的用戶端程式代碼需要 SqlClientPermission。
下列程式代碼會建立SqlClientPermission物件,並設定PermissionState為Unrestricted。 如果呼叫堆疊中所有較高的呼叫者都未被授予權限,
// 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;
}
}
' 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
選擇通知物件
查詢通知 API 提供兩個物件來處理通知: SqlDependency 和 SqlNotificationRequest。 一般而言,大部分 non-ASP.NET 應用程式都應該使用 SqlDependency 物件。 ASP.NET 應用程式應該使用較高層級 SqlCacheDependency,其會 SqlDependency 包裝並提供管理通知和快取對象的架構。
使用 SqlDependency
若要使用 SqlDependency,必須使用 的 SQL Server 資料庫啟用 Service Broker,而且用戶必須具有接收通知的許可權。 Service Broker 物件,例如通知佇列,會預先定義。
此外,SqlDependency 會自動啟動工作者執行緒,在通知被張貼到佇列時處理這些通知;它也會剖析 Service Broker 訊息,將資訊呈現為事件引數資料。
SqlDependency 必須藉由呼叫 Start 方法來初始化 ,才能建立資料庫的相依性。 這是靜態方法,在應用程式初始化期間只需要針對每個資料庫連接呼叫一次。 應在應用程式終止時呼叫 Stop 方法,針對已建立的每個相依連線。
使用 SqlNotificationRequest
相反地,SqlNotificationRequest 您必須自行實作整個監聽基礎結構。 此外,必須定義佇列支援的所有 Service Broker 物件,例如佇列、服務和訊息類型。 如果您的應用程式需要特殊的通知訊息或通知行為,或您的應用程式是較大型Service Broker 應用程式的一部分,這個手動方法就很有用。
另請參閱
- SQL Server 中的查詢通知
- ADO.NET 概觀