Dela via


Identifiera ändringar med SqlDependency

Ett SqlDependency objekt kan associeras med ett SqlCommand för att identifiera när frågeresultat skiljer sig från dem som ursprungligen hämtades. Du kan också tilldela ett ombud till OnChange händelsen, som utlöses när resultatet ändras för ett associerat kommando. Du måste associera SqlDependency med kommandot innan du kör kommandot. Egenskapen HasChanges SqlDependency för kan också användas för att avgöra om frågeresultatet har ändrats sedan data först hämtades.

Säkerhetsöverväganden

Beroendeinfrastrukturen förlitar sig på en SqlConnection som öppnas när Start anropas för att ta emot meddelanden om att underliggande data har ändrats för ett visst kommando. Möjligheten för en klient att initiera anropet till SqlDependency.Start styrs med hjälp av SqlClientPermission och kodåtkomstsäkerhetsattribut. Mer information finns i Aktivera frågemeddelanden och kodåtkomstsäkerhet och ADO.NET.

Exempel

Följande steg visar hur du deklarerar ett beroende, kör ett kommando och får ett meddelande när resultatuppsättningen ändras:

  1. Initiera en SqlDependency anslutning till servern.

  2. Skapa SqlConnection och SqlCommand objekt för att ansluta till servern och definiera en Transact-SQL-instruktion.

  3. Skapa ett nytt SqlDependency objekt eller använd ett befintligt objekt och binda det till objektet SqlCommand . Internt skapar detta ett SqlNotificationRequest objekt och binder det till kommandoobjektet efter behov. Den här meddelandebegäran innehåller en intern identifierare som unikt identifierar det här SqlDependency objektet. Den startar också klientlyssnaren om den inte redan är aktiv.

  4. Prenumerera en händelsehanterare på OnChange händelsen för SqlDependency objektet.

  5. Kör kommandot med någon av objektmetoderna Execute SqlCommand . Eftersom kommandot är bundet till meddelandeobjektet identifierar servern att det måste generera ett meddelande och köinformationen pekar på beroendekön.

  6. SqlDependency Stoppa anslutningen till servern.

Om någon användare senare ändrar underliggande data upptäcker Microsoft SQL Server att det finns ett meddelande som väntar på en sådan ändring och publicerar ett meddelande som bearbetas och vidarebefordras till klienten via den underliggande SqlConnection som skapades genom att anropa SqlDependency.Start. Klientlyssnaren tar emot ogiltighetsmeddelandet. Klientlyssnaren letar sedan upp det associerade SqlDependency objektet och utlöser OnChange händelsen.

Följande kodfragment visar det designmönster som du skulle använda för att skapa ett exempelprogram.

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

Se även