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

SqlServer
496
Sqlserver
监听数据
数据库变化
SqlDependency
变化时发起通知

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);
}
Microsoft SQL Server 2008 R2  不同版本永久安装激活序列号
SqlServer2008r2日志文件导致磁盘爆满的解决办法
C# 如何实现windows服务器判断是否已经安装了sqlserver数据库
SqlServer数据库服务手动操作重启后长时间显示(正在恢复)
C#使用SqlBulkCopy向Sqlserver数据库大批量更新插入数据数据库的例子
SqlServer 如何生成32位 GUID
Sqlserver数据库中SqlDataAdapter.Fill的简单用法
SQLServer成功与服务器建立连接,但是在登录前的握手期间发生错误
Sqlserver Insert 触发器语句实现表的实时备份
记一次商品库存数及库龄的SQLSERVER数据库统计查询
Sqlserver(MSSQL) 数据库如何限制最大可使用内存及占用
暂无相关内容...
暂无相关内容...
免责声明 部分转载分享内容若侵犯您的权益,还请 邮件联系 侵删