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 OnChange evento, que será acionado quando os resultados forem alterados para um comando associado. Você deve associar o SqlDependency com o comando antes de executar o comando. A HasChanges propriedade do também pode ser usada para determinar se os resultados da SqlDependency consulta 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 atributos de segurança de acesso ao código e SqlClientPermission ao código. Para obter mais informações, consulte Habilitando notificações de consulta e segurança e ADO.NET de acesso ao código.

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. Inscreva um manipulador de eventos no OnChange evento do SqlDependency objeto.

  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