Wykrywanie zmian za pomocą elementu SqlDependency

Obiekt SqlDependency można skojarzyć z obiektem SqlCommand , aby wykryć, kiedy wyniki zapytania różnią się od pierwotnie pobranych. Możesz również przypisać delegata do OnChange zdarzenia, które zostanie wyzwolony po zmianie wyników dla skojarzonego polecenia. Przed wykonaniem polecenia należy skojarzyć element SqlDependency z poleceniem . Właściwość HasChangesSqlDependency obiektu można również użyć do określenia, czy wyniki zapytania uległy zmianie od czasu pierwszego pobrania danych.

Zagadnienia związane z zabezpieczeniami

Infrastruktura zależności opiera się na SqlConnection obiekcie, który jest otwarty, gdy Start jest wywoływany w celu odbierania powiadomień o zmianie danych bazowych dla danego polecenia. Możliwość inicjowania wywołania SqlDependency.Start przez klienta jest kontrolowana za pomocą atrybutów zabezpieczeń dostępu SqlClientPermission do kodu i . Aby uzyskać więcej informacji, zobacz Włączanie powiadomień dotyczących zapytań i zabezpieczeń dostępu kodu oraz ADO.NET.

Przykład

Poniższe kroki ilustrują sposób deklarowania zależności, wykonywania polecenia i odbierania powiadomienia po zmianie zestawu wyników:

  1. Zainicjuj SqlDependency połączenie z serwerem.

  2. Utwórz SqlConnection obiekty i SqlCommand w celu nawiązania połączenia z serwerem i zdefiniuj instrukcję języka Transact-SQL.

  3. Utwórz nowy SqlDependency obiekt lub użyj istniejącego obiektu i powiąż go z obiektem SqlCommand . Wewnętrznie tworzy SqlNotificationRequest obiekt i wiąże go z obiektem polecenia zgodnie z potrzebami. To żądanie powiadomienia zawiera wewnętrzny identyfikator, który jednoznacznie identyfikuje ten SqlDependency obiekt. Uruchamia również odbiornik klienta, jeśli nie jest jeszcze aktywny.

  4. Subskrybowanie programu obsługi zdarzeń do OnChange zdarzenia SqlDependency obiektu.

  5. Wykonaj polecenie przy użyciu dowolnej metody ExecuteSqlCommand obiektu. Ponieważ polecenie jest powiązane z obiektem powiadomień, serwer rozpoznaje, że musi wygenerować powiadomienie, a informacje o kolejce będą wskazywać kolejkę zależności.

  6. Zatrzymaj SqlDependency połączenie z serwerem.

Jeśli jakikolwiek użytkownik następnie zmieni dane bazowe, program Microsoft SQL Server wykryje, że istnieje powiadomienie oczekujące na taką zmianę, a następnie opublikuje powiadomienie, które jest przetwarzane i przekazywane do klienta za pośrednictwem bazowego SqlConnection , który został utworzony przez wywołanie metody SqlDependency.Start. Odbiornik klienta odbiera komunikat o unieważnieniu. Odbiornik klienta lokalizuje następnie skojarzony SqlDependency obiekt i uruchamia OnChange zdarzenie.

Poniższy fragment kodu przedstawia wzorzec projektu używany do utworzenia przykładowej aplikacji.

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

Zobacz też