65.9K
CodeProject 正在变化。 阅读更多。
Home

在 .NET 2.0 中使用查询通知处理临时数据刷新

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.62/5 (22投票s)

2006年2月2日

2分钟阅读

viewsIcon

96920

SQL Server 2005 中的查询通知解决了必须维护轮询数据库以获取更新数据的难题。SQL Server 2005 的新通知服务可以执行这项惊人的任务,即在对指定表执行任何 DML 操作时通知 .NET 代码。

引言

SQL Server 2005 中的查询通知解决了必须维护轮询数据库以获取更新数据的难题。SQL Server 2005 的新通知服务可以执行这项惊人的任务,即在对指定表执行任何 DML 操作时通知 .NET 代码。通知周期从 .NET 2.0 应用程序开始,通过名为 SqlDependency 的对象(在 System.Data.SqlClient 命名空间中),该对象仅获取包含查询的 SQLCommand 对象。

SqlCommand cmd = new SqlCommand("SELECT ID, Name, " + 
   "Address FROM dbo.employee", SQLConnectionObject));
SqlDependency depend = new SqlDependency(cmd);

必须使用以下方法启动依赖关系

SqlDependency.Start(connstring);
//It takes the connection string as a parameter.

现在,问题是该如何通知以及谁将得到通知?

答案在于您创建的 SQLDependency 实例。您可以在 SqlDependency 对象的 OnChange 事件上委托一个事件处理程序。

SqlDependency depend = new SqlDependency(cmd);
SqlDependency.Start(connstring);
depend.OnChange += new OnChangeEventHandler(MyOnChanged);

因此,当通知到达时,它会转到指定的处理程序。

准备 SQL Server 2005 以进行通知

  1. 安装通知服务

    您必须从 SQL Server 2005 安装包中安装 SQL Server 通知服务。如果它已安装,您肯定会在 SQL Server Management Studio 中看到一个“通知服务”文件夹。

  2. 启用 .NET CLR

    您必须为 SQL Server 2005 启用 .NET CLR,因为服务代理会使用它。

    要启用 .NET CLR,请执行此命令

    EXEC sp_configure 'show advanced options' , '1';
    go
    reconfigure;
    go
    EXEC sp_configure 'clr enabled' , '1'
    go
    reconfigure;
    go
  3. 启用代理

    查询通知使用服务代理 SERVICE。在这种情况下,SERVICE 是异步消息的目的地;可能需要这些消息遵循一组称为 CONTRACT 的特定规则。服务代理 SERVICE 始终与作为物理消息目的地的 QUEUE 相关联。

    必须使用以下语句为每个数据库启用代理

    ALTER DATABASE databasename SET ENABLE_BROKER
  4. 授予权限

    使用以下语句向用户授予权限

    GRANT SUBSCRIBE QUERY NOTIFICATIONS TO username

关于通知

创建的通知始终执行一次。因此,当通知到达时,它的工作就完成了,并且要继续接收通知,您必须在处理程序上重新创建 SqlDependency

查询通知的最佳用法是在缓存的情况下。您不必一次又一次地轮询数据库以找出任何数据更改。您可以在处理程序中使缓存无效并再次获取数据表,并同时使用新的通知重新创建 SqlDependency

请注意,由于 SQL Server 2005 Express 不支持通知服务,因此您将无法在 SQL Server 2005 Express 中执行查询通知。

链接

有关更多信息,您可以阅读这篇文章

本文介绍了使用 SqlNotificationRequest、服务代理和队列的自定义通知查询。

示例

以下示例代码片段使用 SQL Server 通知功能

using System.Data.SqlClient;
public void button1_Click(object sender, EventArgs e)
{
    string connstring = @"Data Source=SQLServer2005;" + 
       @"Initial Catalog=TestDB;Persist Security Info" + 
       @"=True;User ID=username;Password=password;" + 
       @"Pooling=True;Min Pool Size=5;Max Pool Size=100;" + 
       @"Asynchronous Processing=True;" + 
       @"MultipleActiveResultSets=True;Connect Timeout=15";
    List<string> list = new List<string>();
    using (SqlConnection conn = new SqlConnection(connstring))
        using (SqlCommand cmd = new SqlCommand("SELECT" + 
               " SELECT ID, Name, Address" + 
               " FROM dbo.employee", conn))
        {
            try
            {
                SqlDependency depend = new SqlDependency(cmd);
                SqlDependency.Start(connstring);
                depend.OnChange += new 
                  OnChangeEventHandler(MyOnChanged);
                conn.Open();
                SqlDataReader rdr = cmd.ExecuteReader();
                //perform any operation here
                while (rdr.Read())
                    list.Add(rdr[0].ToString());
                rdr.Close();
            }
            catch (Exception ee)
            {
                    string msg = ee.Message;
            }
        }
}

static void MyOnChanged(object caller, SqlNotificationEventArgs e)
{
    //to test place a break point here 
    //and change any data in the specified table
    string msg = "Notified";
}
© . All rights reserved.