C# SqlDependency如何实现监听当数据库某个表有数据变化时(增删改)进行收到通知
SqlDependency:
SqlDependency 对象表示应用程序和 SQL Server 实例间的查询通知依赖关系。应用程序可以创建一个 SqlDependency 对象并进行注册以通过OnChangeEventHandler 事件处理程序接收通知。
它提供了这样一种能力:当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的。
应用:数据实时性较高的场景、新闻、监控数据等。
可以结合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); }