Wijzigingen detecteren met SqlDependency
Een SqlDependency object kan worden gekoppeld aan een SqlCommand om te detecteren wanneer queryresultaten verschillen van diegene die oorspronkelijk zijn opgehaald. U kunt ook een gemachtigde toewijzen aan de OnChange
gebeurtenis, die wordt geactiveerd wanneer de resultaten voor een bijbehorende opdracht worden gewijzigd. U moet de SqlDependency opdracht aan de opdracht koppelen voordat u de opdracht uitvoert. De HasChanges
eigenschap van de SqlDependency functie kan ook worden gebruikt om te bepalen of de queryresultaten zijn gewijzigd sinds de gegevens voor het eerst zijn opgehaald.
Beveiligingsoverwegingen
De afhankelijkheidsinfrastructuur is afhankelijk van een SqlConnection die wordt geopend wanneer Start deze wordt aangeroepen om meldingen te ontvangen die de onderliggende gegevens voor een bepaalde opdracht hebben gewijzigd. De mogelijkheid voor een client om de aanroep naar te SqlDependency.Start
initiƫren, wordt beheerd door het gebruik van SqlClientPermission en codetoegangsbeveiligingskenmerken. Zie Querymeldingen inschakelen en Beveiliging voor codetoegang en ADO.NET voor meer informatie.
Opmerking
De volgende stappen laten zien hoe u een afhankelijkheid declareert, een opdracht uitvoert en een melding ontvangt wanneer de resultatenset wordt gewijzigd:
Start een
SqlDependency
verbinding met de server.Maak SqlConnection en SqlCommand objecten om verbinding te maken met de server en definieer een Transact-SQL-instructie.
Maak een nieuw
SqlDependency
object of gebruik een bestaand object en bind het aan hetSqlCommand
object. Intern wordt er een SqlNotificationRequest object gemaakt en wordt het indien nodig gekoppeld aan het opdrachtobject. Deze meldingsaanvraag bevat een interne id die ditSqlDependency
object uniek identificeert. De clientlistener wordt ook gestart als deze nog niet actief is.Abonneer een gebeurtenis-handler op de
OnChange
gebeurtenis van hetSqlDependency
object.Voer de opdracht uit met behulp van een van de
Execute
methoden van hetSqlCommand
object. Omdat de opdracht is gebonden aan het meldingsobject, herkent de server dat er een melding moet worden gegenereerd. De wachtrijgegevens verwijzen naar de wachtrijafhankelijkhedenwachtrij.Stop de
SqlDependency
verbinding met de server.
Als een gebruiker vervolgens de onderliggende gegevens wijzigt, detecteert Microsoft SQL Server dat er een melding in behandeling is voor een dergelijke wijziging en plaatst een melding die wordt verwerkt en doorgestuurd naar de client via de onderliggende SqlConnection
gegevens die zijn gemaakt door aan te roepen SqlDependency.Start
. De clientlistener ontvangt het ongeldige bericht. De clientlistener zoekt vervolgens het bijbehorende SqlDependency
object en de gebeurtenis wordt OnChange
geactiveerd.
In het volgende codefragment ziet u het ontwerppatroon dat u zou gebruiken om een voorbeeldtoepassing te maken.
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);
}