Aktivieren von Abfragebenachrichtigungen (ADO.NET)
Aktualisiert: November 2007
Anwendungen, die Abfragebenachrichtigungen verwenden, haben einige Anforderungen gemeinsam. Die Datenquelle muss richtig konfiguriert sein, damit SQL-Abfragebenachrichtigungen unterstützt werden, und die Benutzer müssen über die entsprechenden Client- und Serverberechtigungen verfügen.
Zum Verwenden von Abfragebenachrichtigungen muss Folgendes erfüllt sein:
Verwendung von SQL Server 2005 oder SQL Server 2008.
Aktivieren von Abfragebenachrichtigungen für Ihre Datenbank.
Sicherstellen, dass die zum Verbinden mit der Datenbank verwendete Benutzer-ID über die erforderlichen Berechtigungen verfügt.
Verwenden eines SqlCommand-Objekts zum Ausführen einer gültigen SELECT-Anweisung mit einem zugehörigen Benachrichtigungsobjekt, entweder SqlDependency oder SqlNotificationRequest.
Bereitstellen von Code, um die Benachrichtigung zu verarbeiten, falls sich die überwachten Daten ändern.
Anforderungen für Abfragebenachrichtigungen
Abfragebenachrichtigungen werden nur für SELECT-Anweisungen unterstützt, die eine Liste spezifischer Anforderungen erfüllen. Die folgende Tabelle enthält Links zur Dokumentation von Service Broker und Abfragebenachrichtigungen in der SQL Server-Onlinedokumentation.
SQL Server 2005-Onlinedokumentation |
SQL Server 2008-Onlinedokumentation |
---|---|
Aktivieren von Abfragebenachrichtigungen zur Ausführung von Beispielcode
Führen Sie zum Aktivieren von Service Broker in der AdventureWorks-Datenbank mit SQL Server Management Studio die folgende Transact-SQL-Anweisung aus:
ALTER DATABASE AdventureWorks SET ENABLE_BROKER;
Damit die Abfragebenachrichtigungsbeispiele ordnungsgemäß ausgeführt werden, müssen auf dem Datenbankserver die folgenden Transact-SQL-Anweisungen ausgeführt werden:
CREATE QUEUE ContactChangeMessages;
CREATE SERVICE ContactChangeNotifications
ON QUEUE ContactChangeMessages
([https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);
Berechtigungen für Abfragebenachrichtigungen
Benutzer, die Befehle ausführen, mit denen Benachrichtigung angefordert werden, müssen über eine SUBSCRIBE QUERY NOTIFICATIONS-Datenbankberechtigung auf dem Server verfügen.
Clientseitiger Code, der in einem teilweise vertrauenswürdigen Kontext ausgeführt wird, erfordert die SqlClientPermission.
Im folgenden Code wird ein SqlClientPermission-Objekt erstellt, das den PermissionState auf Unrestricted setzt. Die Demand erzwingt zur Laufzeit eine SecurityException, wenn nicht allen Aufrufern, die sich in der Aufrufliste darüber befinden, die Berechtigung gewährt wurde.
' 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;
}
}
Auswählen eines Benachrichtigungsobjekts
Die Abfragebenachrichtigungs-API stellt zwei Objekte zum Verarbeiten von Benachrichtigungen zur Verfügung: SqlDependency und SqlNotificationRequest. Im Allgemeinen sollten die meisten Nicht-ASP.NET-Anwendungen das SqlDependency-Objekt verwenden. ASP.NET-Anwendungen sollten die übergeordnete SqlCacheDependency verwenden, die die SqlDependency umschließt und einen Rahmen für die Verwaltung der Benachrichtigungs- und Zwischenspeicherobjekte bietet.
Verwenden von "SqlDependency"
Zur Verwendung von SqlDependency muss Service Broker für die verwendete SQL Server 2005-Datenbank aktiviert sein, und Benutzer müssen über Berechtigungen zum Erhalt von Benachrichtigungen verfügen. Service Broker-Objekte, z. B. Benachrichtigungswarteschlangen, werden vordefiniert.
Zusätzlich startet SqlDependency automatisch einen Arbeitsthread, um Benachrichtigungen in der Reihenfolge zu verarbeiten, in der sie in der Warteschlange bereitgestellt werden. Außerdem wird die Service Broker-Meldung analysiert und die Informationen werden als Ereignisargumentdaten verfügbar gemacht. SqlDependency muss durch Aufrufen der Start-Methode initialisiert werden, um eine Abhängigkeit zur Datenbank herzustellen. Dies ist eine statische Methode, die nur einmal während der Initialisierung der Anwendung für jede erforderliche Datenbankverbindung aufgerufen werden muss. Für jede Abhängigkeit, die hergestellt wurde, sollte die Stop-Methode bei Beenden der Anwendung aufgerufen werden.
Verwenden von "SqlNotificationRequest"
Im Gegensatz dazu erfordert SqlNotificationRequest das eigene Implementieren der gesamten Empfangsinfrastruktur. Zusätzlich müssen alle unterstützenden Service Broker-Objekte (z. B. die Warteschlange, der Dienst und die von der Warteschlange unterstützen Meldungstypen) definiert werden. Dieser manuelle Ansatz ist nützlich, wenn Ihre Anwendung besondere Benachrichtigungsmeldungen oder ein besonderes Benachrichtigungsverhalten erfordert, oder wenn Ihre Anwendung Teil einer größeren Service Broker-Anwendung ist.