转自:https://blog.csdn.net/u012183487/article/details/77776930
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} PASSWORD:{1} ", 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'
然后,执行完上一句话之后,再次只执行下面的这句话:
ALTER DATABASE DBforStudy SET ENABLE_BROKER;
这时,再次运行
SELECT is_broker_enabled FROM sys.databases WHERE name = 'DBforStudy'
返回的结果变成了1
然后再次运行C#控制台应用程序,效果如下:
此时,不要关闭控制台应用程序,往数据库的表中写入数据,比如 我添加两行数据 0000,0000;1111,1111;
可见 每一次添加数据时 控制台就相应输出了新添加的内容。