Partilhar via


Detetando alterações com SqlDependency

Baixar ADO.NET

Um objeto pode ser associado a um SqlDependency para detetar quando os resultados da SqlCommand consulta diferem dos resultados originalmente recuperados. Também podes atribuir um delegado ao OnChange evento, que será ativado quando os resultados mudarem para um comando associado. Associe-o SqlDependency ao comando antes de executá-lo. A HasChanges propriedade do SqlDependency também pode ser usada para determinar se os resultados da consulta mudaram desde que os dados foram recuperados pela primeira vez.

Considerações de segurança

Baseia-se numa infraestrutura de dependência em que um SqlConnection é aberto quando Start é chamado para receber notificações de alterações nos dados subjacentes de um determinado comando. A capacidade de um cliente iniciar a chamada SqlDependency.Start é controlada pela utilização de SqlClientPermission e dos atributos de segurança de acesso ao código. Para mais informações, consulte Ativar notificações de consultas.

Example

Os passos seguintes ilustram como declarar uma dependência, executar um comando e receber uma notificação quando o conjunto de resultados muda:

  1. Inicie uma SqlDependency ligação ao servidor.

  2. Criar objetos SqlConnection e SqlCommand para ligar ao servidor e definir uma instrução Transact-SQL.

  3. Cria um novo SqlDependency objeto, ou usa um existente, e liga-o ao SqlCommand objeto. Internamente, esta associação cria um SqlNotificationRequest objeto e liga-o ao objeto de comando conforme necessário. Este pedido de notificação contém um identificador interno que identifica de forma única este SqlDependency objeto. Também inicia o ouvinte cliente se este ainda não estiver ativo.

  4. Inscreva um gestor de eventos no evento OnChange do objeto SqlDependency.

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

  6. Corta a SqlDependency ligação ao servidor.

Se algum utilizador alterar os dados subjacentes, o Microsoft SQL Server deteta que há uma notificação pendente para tal alteração e publica uma notificação que é processada e encaminhada para o cliente através do subjacente SqlConnection criado ao chamar SqlDependency.Start. O ouvinte cliente recebe a mensagem de invalidação. O ouvinte cliente localiza então o objeto associado SqlDependency e lança o OnChange evento.

O seguinte fragmento de código mostra o padrão de design que usaria para criar uma aplicação de exemplo.

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

Próximos passos