Detectando alterações com SqlDependency
Um objeto SqlDependency pode ser associado a um SqlCommand para detectar quando os resultados da consulta são diferentes dos resultados recuperados originalmente. Você também pode atribuir um delegado ao evento OnChange
, que será acionado quando os resultados forem alterados para um comando associado. Antes de executar o comando, associe o SqlDependency a ele. A propriedade HasChanges
do SqlDependency também pode ser usada para determinar se os resultados da consulta foram alterados desde que os dados foram recuperados pela primeira vez.
Considerações de segurança
A infraestrutura de dependência usa 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 usando SqlClientPermission e atributos de segurança de acesso do código. Para obter mais informações, confira Habilitar notificações de consulta.
Exemplo
As seguintes etapas ilustram como declarar uma dependência, executar um comando e receber uma notificação quando o conjunto de resultados for alterado:
Inicia uma conexão
SqlDependency
com o servidor.Crie objetos SqlConnection e SqlCommand para se conectar ao servidor e definir uma instrução Transact-SQL.
Crie um objeto
SqlDependency
ou use um existente e associe-o ao objetoSqlCommand
. Internamente, essa associação cria um objeto SqlNotificationRequest e o associa ao objeto de comando, conforme necessário. Essa solicitação de notificação contém um identificador interno que identifica exclusivamente esse objetoSqlDependency
. Ela também iniciará o ouvinte do cliente se ele ainda não estiver ativo.Assine um manipulador de eventos para o evento
OnChange
do objetoSqlDependency
.Execute o comando usando qualquer um dos métodos
Execute
do objetoSqlCommand
. Já que o comando está associado ao objeto de notificação, o servidor reconhece que ele precisa gerar uma notificação e as informações da fila apontarão para a fila de dependências.Interrompa a conexão de
SqlDependency
com o servidor.
Se qualquer usuário alterar os dados subjacentes, o Microsoft SQL Server detectará a existência de uma notificação pendente para tal alteração e postará uma notificação que será processada e encaminhada ao cliente por meio do SqlConnection
subjacente, criado por uma chamada a SqlDependency.Start
. O ouvinte de cliente recebe a mensagem de invalidação. Em seguida, o ouvinte de cliente localiza o objeto SqlDependency
associado e aciona o evento OnChange
.
O fragmento de código a seguir mostra o padrão de design que você usaria para criar um aplicativo 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óximas etapas
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de