使用 SqlDependency 检测更改
SqlDependency 对象可以与 SqlCommand 相关联,以便检测查询结果与最初检索到的结果不同的情况。 还可以为 OnChange
事件分配一个委托,该事件将在关联命令的结果变更时激发。 在执行命令之前,必须将 SqlDependency 与命令相关联。 SqlDependency 的 HasChanges
属性还可用于确定自第一次检索数据后,查询结果是否变更。
安全注意事项
依赖项基础结构依赖于调用 Start 时打开的 SqlConnection,以便接收已针对给定命令更改基础数据的通知。 客户端启动对 SqlDependency.Start
的调用的能力通过使用 SqlClientPermission 和代码访问安全性特性进行控制。 有关详细信息,请参阅启用查询通知和代码访问安全性与 ADO.NET。
示例
以下步骤演示了如何声明依赖项、执行命令以及在结果集更改时接收通知:
启动通向服务器的
SqlDependency
连接。创建 SqlConnection 和 SqlCommand 对象以连接到服务器并定义 Transact-SQL 语句。
创建新的
SqlDependency
对象或使用现有对象,然后将其绑定到SqlCommand
对象。 在内部,这将创建一个 SqlNotificationRequest 对象,并根据需要将其绑定到命令对象。 此通知请求包含唯一标识此SqlDependency
对象的内部标识符。 如果客户端侦听器尚未处于活动状态,它还会启动它。向
SqlDependency
对象的OnChange
事件订阅事件处理程序。使用
SqlCommand
对象的任何Execute
方法执行该命令。 因为该命令绑定到通知对象,所以服务器认识到它必须生成一个通知,并且队列信息将指向依赖项队列。停止与服务器的
SqlDependency
连接。
如果任何用户随后更改了基础数据,则 Microsoft SQL Server 将检测到存在此类更改的挂起通知,并发布通知,该通知通过调用 SqlDependency.Start
创建的基础 SqlConnection
进行处理并转发给客户端。 客户端侦听器接收失效消息。 然后,客户端侦听器查找关联的 SqlDependency
对象,并激发 OnChange
事件。
下面的代码段显示用于创建示例应用程序的设计模式。
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);
}