使用 SqlDependency 检测更改 (ADO.NET)

使用 SqlDependency 检测更改 (ADO.NET)

.NET Framework 4

其他版本

 

SqlDependency 对象可以与 SqlCommand 关联,以便检测查询结果何时与最初检索的结果不同。也可以向 OnChange 事件分配一个委托,当关联命令的结果更改时,将会触发该委托。在执行命令前,必须将 SqlDependency 与该命令关联。也可以使用 SqlDependency 的 HasChanges 属性来确定自从首次检索数据以来查询结果是否已经更改。

安全注意事项


依赖项基础结构依赖于 SqlConnection,它会在调用 Start 时打开,以便接收有关给定命令的基础数据已经更改的通知。 客户端启动对 SqlDependency.Start 的调用的能力是通过使用 SqlClientPermission 和代码访问安全性属性来控制的。 有关更多信息,请参见启用查询通知 (ADO.NET)代码访问安全性和 ADO.NET

示例

下面的步骤演示如何声明依赖项、执行命令和在结果集更改时接收通知:

  1. 启动到服务器的 SqlDependency 连接。

  2. 创建 SqlConnectionSqlCommand 对象以连接到服务器并定义 Transact-SQL 语句。

  3. 创建一个新的 SqlDependency 对象,或使用现有的对象,并将其绑定到 SqlCommand 对象。 这会在内部创建一个 SqlNotificationRequest 对象并根据需要将其绑定到命令对象。 此通知请求包含一个内部标识符,可唯一地标识此 SqlDependency 对象。 如果客户端侦听器尚未处于活动状态,它也将启动客户端侦听器。

  4. 订阅一个针对 SqlDependency 对象的 OnChange 事件的事件处理程序。

  5. 使用 SqlCommand 对象的任一 Execute 方法执行该命令。 因为该命令绑定到通知对象,所以服务器认识到它必须生成一个通知,并且队列信息将指向相关性队列。

  6. 停止到服务器的 SqlDependency 连接。

如果任何用户随后更改了基础数据,Microsoft SQL Server 会检测到有针对此更改的挂起通知并发布通知,此通知经过处理后通过调用 SqlDependency.Start 而创建的基础 SqlConnection 转发到客户端。 客户端侦听程序接收无效消息。 然后客户端侦听器定位关联的 SqlDependency 对象并触发 OnChange 事件。

下面的代码段演示创建示例应用程序所要使用的设计模式。

VB

C#

C++

F#

JScript

复制

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

请参见


其他资源

SQL Server 中的查询通知 (ADO.NET)

发布了162 篇原创文章 · 获赞 44 · 访问量 64万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览