使用 SqlDependency 检测更改

下载 ADO.NET

SqlDependency 对象可以与 SqlCommand 相关联,以检测查询结果与最初检索到的结果不同的情况。 还可以为 OnChange 事件分配一个委托,该事件将在关联命令的结果变更时激发。 在执行命令之前,请将 SqlDependency 与命令相关联。 SqlDependencyHasChanges 属性还可用于确定自第一次检索数据后,查询结果是否变更。

安全注意事项

依赖项基础结构依赖于调用 Start 时打开的 SqlConnection,以接收已针对给定命令更改基础数据的通知。 客户端开始调用 SqlDependency.Start 的能力是通过使用 SqlClientPermission 和代码访问安全性属性来控制的。 有关详细信息,请参阅启用查询通知

示例

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

  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 事件。

下面的代码段显示用于创建示例应用程序的设计模式。

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

后续步骤