Détection des modifications avec SqlDependency
Un objet SqlDependency peut être associé à une SqlCommand afin de détecter si les résultats de la requête diffèrent de ceux qui sont récupérés à l’origine. Vous pouvez également attribuer un délégué à l’événement OnChange
, qui se déclenche lorsque les résultats changent pour une commande associée. Vous devez associer la SqlDependency à la commande avant d’exécuter la commande. La propriété HasChanges
de la SqlDependency peut également être utilisée pour déterminer si les résultats de la requête ont changé depuis la première récupération des données.
Considérations relatives à la sécurité
L’infrastructure de dépendance repose sur une SqlConnection qui est ouverte lorsque Start est appelé pour recevoir des notifications de modification des données sous-jacentes pour une commande donnée. La possibilité pour un client d’initier l’appel à SqlDependency.Start
est contrôlée par le biais de l’utilisation de SqlClientPermission et des attributs de sécurité d’accès du code. Pour plus d’informations, consultez Activation des notifications de requête et Sécurité d’accès du code et ADO.NET.
Exemple
Les étapes suivantes montrent comment déclarer une dépendance, exécuter une commande et recevoir une notification lorsque le jeu de résultats change :
Établit une connexion
SqlDependency
au serveur.Créez des objets SqlConnection et SqlCommand pour vous connecter au serveur et définir une instruction Transact-SQL.
Créez un objet
SqlDependency
ou utilisez un objet existant, puis liez-le à l’objetSqlCommand
. En interne, cela crée un objet SqlNotificationRequest et le lie à l’objet de commande en fonction des besoins. Cette requête de notification contient un identificateur interne qui identifie de façon unique cet objetSqlDependency
. L’écouteur client est également démarré s’il n’est pas déjà actif.Abonnez un gestionnaire d’événements à l’événement
OnChange
de l’objetSqlDependency
.Exécutez la commande à l’aide de l’une des méthodes
Execute
de l’objetSqlCommand
. Étant donné que la commande est liée à l’objet de notification, le serveur reconnaît qu’il doit générer une notification, et les informations de la file d’attente pointent vers la file d’attente des dépendances.Arrêtez la connexion
SqlDependency
au serveur.
Si un utilisateur modifie ensuite les données sous-jacentes, Microsoft SQL Server détecte qu’il existe une notification en attente pour une telle modification, puis publie une notification qui est traitée et transférée au client via la SqlConnection
sous-jacente qui a été créée en appelant SqlDependency.Start
. L’écouteur client reçoit le message d’invalidation. L’écouteur client localise ensuite l’objet SqlDependency
associé et déclenche l’événement OnChange
.
Le fragment de code suivant montre le modèle de conception que vous utiliseriez pour créer un exemple d’application.
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.
Using 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 reference in a class member.
' Subscribe to the SqlDependency event.
AddHandler dependency.OnChange, AddressOf OnDependencyChange
' Execute the command.
Using reader = command.ExecuteReader()
' Process the DataReader.
End Using
End Using
End Sub
' Handler method
Sub OnDependencyChange(ByVal sender As Object, _
ByVal e As SqlNotificationEventArgs)
' Handle the event (for example, invalidate this cache entry).
End Sub
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.
using (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 reference in a class member.
// Subscribe to the SqlDependency event.
dependency.OnChange+=new
OnChangeEventHandler(OnDependencyChange);
// Execute the command.
using (SqlDataReader reader = command.ExecuteReader())
{
// Process the DataReader.
}
}
}
// Handler method
void OnDependencyChange(object sender,
SqlNotificationEventArgs e )
{
// Handle the event (for example, invalidate this cache entry).
}
void Termination()
{
// Release the dependency.
SqlDependency.Stop(connectionString, queueName);
}