SQL server 2008R2 中 C#Winfoirm 使用 SqlDependency 机制实现 数据库中某一张表的监视

System.Data.SqlClient命名空间下的 sqlDependency类 可以实现这样的功能:当被监测的数据库中的数据发生变化时,SqlDependency会自动触发dependency_OnChange()事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的.

如下介绍实现方法及其中可能会遇到的问题。

首先,建立一个一个数据库 并在其中建立一张表,如下图所示:

表中的内容如下:

接下来 在VS2012中建立一个C#控制台应用程序,实现表的内容的监控,当表的数据发生变化时, 控制台会实时输出变化。控制台应用程序如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;


namespace SqlDependencyDemo
{
    class Program
    {
        private static string _connStr;
        static void Main(string[] args)
        {
            _connStr = "Data Source =(local);Database = DBforStudy; UID = sa; Pwd = sa"; 
            SqlDependency.Start(_connStr);//传入连接字符串,启动基于数据库的监听  
            UpdateGrid();

            Console.Read();
        }

        private static void UpdateGrid()
        {
            using (SqlConnection connection = new SqlConnection(_connStr))
            {
                //依赖是基于某一张表的,而且查询语句只能是简单查询语句,不能带top或*,同时必须指定所有者,即类似[dbo].[]  
                using (SqlCommand command = new SqlCommand("select USERS,PASSWORD From dbo.T_USERS", connection))
                {
                    command.CommandType = CommandType.Text;
                    connection.Open();
                    SqlDependency dependency = new SqlDependency(command);
                    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

                    SqlDataReader sdr = command.ExecuteReader();
                    Console.WriteLine();
                    while (sdr.Read())
                    {
                        Console.WriteLine("USERS:{0}\tPASSWORD:{1}\t", sdr["USERS"].ToString(), sdr["PASSWORD"].ToString());
                    }
                    sdr.Close();
                }
            }
        }

        private static void dependency_OnChange(object sender, SqlNotificationEventArgs e)
        {
            UpdateGrid();
        }  
    }
}


运行程序,这个过程中可能会抛出错误:

“未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker”

在数据库中新建查询:输入如下代码:

--语法为:SELECT is_broker_enabled FROM sys.databases WHERE name = 'DATABSE_NAME' --DATABASE_NAME 为数据库名称 此处为 DBforStudy
SELECT is_broker_enabled FROM sys.databases WHERE name = 'DBforStudy'

此时返回的 is_broker_enabled de 结果是  0,

不要担心这个错误是因为数据库没有启动 Service Broker而导致的,解决办法很简单,步骤如下:

在上面新建查询中 把 单单执行下面这句话:

use DBforStudy
go
ALTER DATABASE DBforStudy SET NEW_BROKER WITH ROLLBACK IMMEDIATE;


然后,执行完上一句话之后,再次只执行下面的这句话:
ALTER DATABASE DBforStudy  SET ENABLE_BROKER;


这时,再次运行 

SELECT is_broker_enabled FROM sys.databases WHERE name = 'DBforStudy'

返回的结果变成了1

然后再次运行C#控制台应用程序,效果如下:



此时,不要关闭控制台应用程序,往数据库的表中写入数据,比如 我添加两行数据 0000,0000;1111,1111;


可见 每一次添加数据时 控制台就相应输出了新添加的内容。


猜你喜欢

转载自blog.csdn.net/u012183487/article/details/77776930