Erkennen von Änderungen mit 'SqlDependency' (ADO.NET)
Aktualisiert: November 2007
Ein SqlDependency-Objekt kann mit einem SqlCommand verknüpft werden, um so Abweichungen zwischen den aktuellen und den ursprünglichen Abfrageergebnissen zu erkennen. Sie können einen Delegaten auch dem OnChange-Ereignis zuweisen, das ausgelöst wird, wenn sich die Ergebnisse für einen verknüpften Befehl ändern. Vor dem Ausführen des Befehls müssen Sie ihm die SqlDependency zuordnen. Mit der HasChanges-Eigenschaft der SqlDependency kann auch ermittelt werden, ob sich die Abfrageergebnisse seit dem letzten Abrufen der Daten geändert haben.
Sicherheitsüberlegungen
Die Abhängigkeitsinfrastruktur verwendet eine SqlConnection, die geöffnet wird, wenn Start aufgerufen wird, damit Benachrichtigungen über die Änderung der zugrunde liegenden Daten für einen bestimmten Befehl empfangen werden können. Ob ein Client den Aufruf von SqlDependency.Start initiieren kann, wird mit der SqlClientPermission und Sicherheitsattributen für den Codezugriff gesteuert. Weitere Informationen dazu finden Sie unter Aktivieren von Abfragebenachrichtigungen (ADO.NET) und Codezugriffssicherheit und ADO.NET.
Beispiel
Mit den folgenden Schritten können Sie eine Abhängigkeit deklarieren, einen Befehl ausführen und festlegen, dass Sie bei Änderungen des Resultsets benachrichtigt werden möchten:
Initiieren Sie eine SqlDependency-Verbindung mit dem Server.
Erstellen Sie das SqlConnection-Objekt und das SqlCommand-Objekt, um eine Verbindung mit dem Server herzustellen und eine Transact-SQL-Anweisung zu definieren.
Erstellen Sie ein neues SqlDependency-Objekt, oder verwenden Sie ein vorhandenes, und binden Sie es an das SqlCommand-Objekt. Dadurch wird intern ein SqlNotificationRequest-Objekt erstellt und bei Bedarf an das Befehlsobjekt gebunden. Diese Benachrichtigungsanforderung enthält einen internen Bezeichner zur eindeutigen Kennzeichnung dieses SqlDependency-Objekts. Er startet außerdem auch den Clientlistener, sofern dieser nicht bereits aktiv ist.
Abonnieren Sie einen Ereignishandler für das OnChange-Ereignis des SqlDependency-Objekts.
Führen Sie den Befehl mit einer der Execute-Methoden des SqlCommand-Objekts aus. Da der Befehl an das Benachrichtigungsobjekt gebunden ist, erkennt der Server, dass er eine Benachrichtigung generieren muss, und die Warteschlangeninformation zeigt auf die Abhängigkeitenwarteschlange.
Beenden Sie die SqlDependency-Verbindung mit dem Server.
Wenn ein Benutzer anschließend Änderungen an den zugrunde liegenden Daten vornimmt, erkennt Microsoft SQL Server, dass es für eine derartige Änderung eine Benachrichtigung gibt, und übermittelt diese Benachrichtigung über die zugrunde liegende, mit SqlDependency.Start erstellte SqlConnection. Der Clientlistener empfängt die Ungültigkeitserklärung. Der Clientlistener sucht dann das zugeordnete SqlDependency-Objekt und löst das OnChange-Ereignis aus.
Das folgende Codefragment zeigt das Entwurfsmuster, das Sie zum Erstellen einer Beispielanwendung verwenden können:
Sub Initialization()
' Create a dependency connection.
SqlDependency.Start(connectionString, queueName)
End Sub
Sub SomeMethod()
' Assume connection is an open SqlConnection.
' Create a new SqlCommand object.
Dim command As New SqlCommand( _
"SELECT ShipperID, CompanyName, Phone FROM dbo.Shippers", _
connection)
' Create a dependency and associate it with the SqlCommand.
Dim dependency As New SqlDependency(command)
' Maintain the refence in a class member.
' Subscribe to the SqlDependency event.
AddHandler dependency.OnChange, AddressOf OnDependencyChange
' Execute the command.
command.ExecuteReader()
' Process the DataReader.
End Sub
' Handler method
Sub OnDependencyChange(ByVal sender As Object, ByVal e As SqlNotificationsEventArgs)
End Sub
' Handle the event (for example, invalidate this cache entry).
Sub Termination()
' Release the dependency
SqlDependency.Stop(connectionString, queueName)
End Sub
void Initialization()
{
// Create a dependency connection.
SqlDependency.Start(connectionString, queueName);
}
void SomeMethod()
{
// Assume connection is an open SqlConnection.
// Create a new SqlCommand object.
SqlCommand command=new SqlCommand(
"SELECT ShipperID, CompanyName, Phone FROM dbo.Shippers",
connection);
// Create a dependency and associate it with the SqlCommand.
SqlDependency dependency=new SqlDependency(command);
// Maintain the refence in a class member.
// Subscribe to the SqlDependency event.
dependency.OnChange+=new OnChangeEventHandler(OnDependencyChange);
// Execute the command.
command.ExecuteReader();
// Process the DataReader.
}
// Handler method
void OnDependencyChange(object sender,
SqlNotificationsEventArgs e )
{
// Handle the event (for example, invalidate this cache entry).
}
void Termination()
{
// Release the dependency.
SqlDependency.Stop(connectionString, queueName);
}