Share via


Wijzigingen detecteren met SqlDependency

ADO.NET downloaden

Een SqlDependency object kan worden gekoppeld aan een SqlCommand om te detecteren wanneer queryresultaten verschillen van de resultaten 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. Koppel de SqlDependency opdracht aan de opdracht 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 vertrouwt op een SqlConnection die wordt geopend wanneer Start wordt aangeroepen om meldingen te ontvangen dat de onderliggende gegevens voor een bepaalde opdracht zijn gewijzigd. De mogelijkheid voor een client om de aanroep naar SqlDependency.Start te starten, wordt gecontroleerd door SqlClientPermission en beveiligingskenmerken voor codetoegang. Zie Querymeldingen inschakelen voor meer informatie.

Example

De volgende stappen laten zien hoe u een afhankelijkheid declareert, een opdracht uitvoert en een melding ontvangt wanneer de resultatenset wordt gewijzigd:

  1. Start een SqlDependency verbinding met de server.

  2. Maak SqlConnection en SqlCommand objecten om verbinding te maken met de server en definieer een Transact-SQL instructie.

  3. Maak een nieuw SqlDependency object of gebruik een bestaand object en bind het aan het SqlCommand object. Intern maakt deze koppeling een SqlNotificationRequest object en verbindt het naar behoefte aan het opdrachtobject. Deze meldingsaanvraag bevat een interne id die dit SqlDependency object uniek identificeert. De clientlistener wordt ook gestart als deze nog niet actief is.

  4. Abonneer een gebeurtenis-handler op de OnChange gebeurtenis van het SqlDependency object.

  5. Voer de opdracht uit met behulp van een van de Execute methoden van het SqlCommand object. Omdat de opdracht is gebonden aan het meldingsobject, herkent de server dat er een melding moet worden gegenereerd en zullen de wachtrijgegevens verwijzen naar de wachtrij met afhankelijkheden.

  6. 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 op en activeert het OnChange-evenement.

In het volgende codefragment ziet u het ontwerppatroon dat u zou gebruiken om een voorbeeldtoepassing te maken.

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);
}

Volgende stappen