Partilhar via


Detetar alterações com SqlDependency

Um SqlDependency objeto pode ser associado a um SqlCommand para detetar quando os resultados da consulta diferem daqueles originalmente recuperados. Você também pode atribuir um delegado ao evento OnChange, que será acionado quando os resultados forem alterados para o comando associado. Você deve associar o SqlDependency com o comando antes de executar o comando. A propriedade de SqlDependency também pode ser usada para determinar se os resultados da consulta HasChanges foram alterados desde que os dados foram recuperados pela primeira vez.

Considerações de Segurança

A infraestrutura de dependência depende de um SqlConnection que é aberto quando Start é chamado para receber notificações de que os dados subjacentes foram alterados para um determinado comando. A capacidade de um cliente iniciar a chamada para SqlDependency.Start é controlada através do uso de SqlClientPermission e dos atributos de segurança de acesso ao código. Para obter mais informações, consulte Notificações de Consulta e Segurança de Acesso ao Código e ADO.NET.

Exemplo

As etapas a seguir ilustram como declarar uma dependência, executar um comando e receber uma notificação quando o conjunto de resultados for alterado:

  1. Inicie uma SqlDependency conexão com o servidor.

  2. Crie SqlConnection e SqlCommand objetos para se conectar ao servidor e definir uma instrução Transact-SQL.

  3. Crie um novo SqlDependency objeto ou use um existente e associe-o SqlCommand ao objeto. Internamente, isso cria um SqlNotificationRequest objeto e o vincula ao objeto de comando conforme necessário. Esta solicitação de notificação contém um identificador interno que identifica exclusivamente esse SqlDependency objeto. Ele também inicia o ouvinte do cliente se ele ainda não estiver ativo.

  4. Assine um manipulador de eventos ao evento OnChange do objeto SqlDependency.

  5. Execute o comando usando qualquer um dos Execute métodos do SqlCommand objeto. Como o comando está vinculado ao objeto de notificação, o servidor reconhece que ele deve gerar uma notificação e as informações da fila apontarão para a fila de dependências.

  6. Pare a SqlDependency conexão com o servidor.

Se algum usuário alterar posteriormente os dados subjacentes, o Microsoft SQL Server detetará que há uma notificação pendente para tal alteração e publicará uma notificação que é processada e encaminhada para o cliente por meio do subjacente SqlConnection que foi criado chamando SqlDependency.Start. O ouvinte do cliente recebe a mensagem de invalidação. Em seguida, o ouvinte do cliente localiza o objeto associado SqlDependency e dispara o OnChange evento.

O fragmento de código a seguir mostra o padrão de design que você usaria para criar um aplicativo de exemplo.

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

Consulte também