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