『QQ:1353814576』

SqlDependency 实现监听Sqlserver数据库表有变化时发起通知例子


C# SqlDependency如何实现监听当数据库某个表有数据变化时(增删改)进行收到通知

SqlDependency:

  1. SqlDependency 对象表示应用程序和 SQL Server 实例间的查询通知依赖关系。应用程序可以创建一个 SqlDependency 对象并进行注册以通过OnChangeEventHandler 事件处理程序接收通知。

  2. 它提供了这样一种能力:当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的。

  3. 应用:数据实时性较高的场景、新闻、监控数据等。

  4. 可以结合SignalR来实现web的实时数据更新。


前段时间接手了一个烂尾程序,因为觉得维护起来太过复杂和难受(多数时候出问题根本没法找问题 可能是code能力有限),长痛不如短痛,于是整理后拆分重构开发了自己的软件版本,维护起来确实惬意了一段时间,期间因为数据库性能问题有考虑过 使用这个数据库变更通知来替代定时查询来减轻数据库压力,但最后发现这个并不能解决实际需求情况,最后也就没有用上。

这里做下代码记录(网上也挺多的):

一、 在数据库里执行下面的语句 开启数据库的设置 启用数据库监听服务 不然SqlDependency特性无法生效

ALTER DATABASE <数据库名称> SET ENABLE_BROKER;

二、创建一个监听服务


  //数据库链接字符串
static  string SqlConn="";
static void Main(string[] args){
 
   //启动服务
   SqlDependency.Start(SqlConn);
   DBUpdate(conn);
}

private static void Update(string conn)
 {
		    //此处 必须制定字段名 不要使用* 全列查询 另外表名要加上 [dbo]前缀
             string sql = "select column1, column2 from [dbo].[testdata]";
		
            using (SqlConnection connection = new SqlConnection(SqlConn))
            {
			    connection.Open(); 
                using (SqlCommand command = new SqlCommand(sql, connection))
                {
                    command.CommandType=CommandType.Text;
                    dependency = new SqlDependency(command);
                    dependency.OnChange += new OnChangeEventHandler(DB_OnChange);
                    //执行一下command
                    command.ExecuteNonQuery();
                    Console.WriteLine("监听到了数据库的变化");
                }
            }
}

//增删改都会进入这里
private static void DB_OnChange(object sender, SqlNotificationEventArgs e)
{
            //这里可以判断下 当前的变化类型 具体是增删改 哪一个类型
            Console.WriteLine("监听数据变动时间:"+DateTime.Now);
            //因为监听到不到具体变动的是具体哪一条数据引发的所以就没用上
            //这里要再次调用
            DBUpdate(SqlConn);
}