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:
Inicie uma
SqlDependency
conexão com o servidor.Crie SqlConnection e SqlCommand objetos para se conectar ao servidor e definir uma instrução Transact-SQL.
Crie um novo
SqlDependency
objeto ou use um existente e associe-oSqlCommand
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 esseSqlDependency
objeto. Ele também inicia o ouvinte do cliente se ele ainda não estiver ativo.Inscreva um manipulador de eventos no
OnChange
evento doSqlDependency
objeto.Execute o comando usando qualquer um dos
Execute
métodos doSqlCommand
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.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);
}