老技术记录-C#+SqlServer使用SqlDependency监听数据库表变化
时间:2019-09-19
本文章向大家介绍老技术记录-C#+SqlServer使用SqlDependency监听数据库表变化,主要包括老技术记录-C#+SqlServer使用SqlDependency监听数据库表变化使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
开发环境: .net / C# (.net core理论上也可以)
数据库:MS SQL Server 2005 以上 (我用的sqlserver2012)
功能:SqlDependency提供了一种机制,当被监听的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让应用程序实时更新数据(或缓存)的目的,而不用定期请求后端,如果加上SignalR技术,基本可以实现实时通信。
我的场景:每天数据变化少,一天不超过十次,但是每次都希望得到提醒,并反应到前台web页面上。
实现步骤:
1、数据库启用 Service Broker
检查数据库是否启用了Service Broker
SELECT is_broker_enabled FROM sys.databases WHERE name = '数据库名'
查询结果:is_broker_enabled de 结果是 0,代表数据库没有启动 Service Broker
解决办法:
use 数据库名 go ALTER DATABASE 数据库名 SET NEW_BROKER WITH ROLLBACK IMMEDIATE; ALTER DATABASE 数据库名 SET ENABLE_BROKER;
注:两句同时执行,单独执行会显示 "正在回滚不合法事务。估计回滚已完成: 100%"
再次查询is_broker_enabled状态,状态为1,数据库没有启动 Service Broker成功。
2、Webconfig 中启用缓存
在<system.web>节点加入
<caching> <sqlCacheDependency enabled="true" pollTime="1000"> <databases> <add name="PDMCAPPS" connectionStringName="数据库连接字符串" pollTime="1000"/> </databases> </sqlCacheDependency> </caching>
3、在Global.asax添加启用和停止监听
string connectionString = ConfigurationManager.ConnectionStrings["数据库连接字符串名称"].ConnectionString; void Application_Start(object sender, EventArgs e) { // Code that runs on application startup System.Data.SqlClient.SqlDependency.Start(connectionString); } void Application_End(object sender, EventArgs e) { // Code that runs on application shutdown System.Data.SqlClient.SqlDependency.Stop(connectionString); }
4、主程序代码
private static string conn = ConfigurationManager.ConnectionStrings["连接字符串名称"].ConnectionString; static SqlDependency dependency; protected void Page_Load(object sender, EventArgs e) { SqlDependency.Start(conn); //传入连接字符串,启动基于数据库的监听 if (!IsPostBack) { Update(conn); } } //使用SqlDependency监控数据库表变化 private void Update(string conn) { using (SqlConnection connection = new SqlConnection(conn)) { StringBuilder strsql = new StringBuilder(); //对被监控的目标表做简单查询,此处 要注意 不能使用* 表名要加[dbo] 否则会出现一直调用执行 OnChange strsql.Append(@"sql查询语句,查询目标表"); using (SqlCommand command = new SqlCommand(strsql.ToString(), connection)) { connection.Open(); command.CommandType = CommandType.Text; dependency = new SqlDependency(command); dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);//添加监控,检测数据表变化 //必须要执行一下command command.ExecuteNonQuery(); //Console.WriteLine(dependency.HasChanges); //connection.Close(); } } } //检测到数据表变化后执行动作 private void dependency_OnChange(object sender, SqlNotificationEventArgs e) { if (e.Type == SqlNotificationType.Change) { //这里要再次调用 Update(conn); //刷新前台页面 Response.AddHeader("Refresh", "0"); } }
原文地址:https://www.cnblogs.com/KyleLi/p/11550312.html
- PHP从数据库提取并显示数据的典型代码
- ThinkPHP导出CSV、Excel
- 使用HttpClient的优解
- 浅谈 EF CORE 迁移和实例化的几种方式
- Python标准库10 多进程初步 (multiprocessing包)
- .NET CORE——Console中使用依赖注入
- EntityFramework Core 自动绑定模型映射
- Python标准库09 当前进程信息 (os包)
- Dapper连接与事务的简单封装
- 数据可视化的秘密
- EntityFramework Core 学习扫盲
- 协议森林03 IP接力赛 (IP, ARP, RIP和BGP协议)
- 从输入url到页面返回到底发生了什么
- 协议森林04 地址耗尽危机 (IPv4与IPv6地址)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 基于DNSmasq写了个WEB界面(开源)
- Android Studio3.6新特性之视图绑定ViewBinding使用指南
- Android recyclerView横条指示器实现淘宝菜单模块
- Android studio kotlin代码格式化操作
- Android Studio升级3.6 Build窗口出现中文乱码问题解决方法
- Android中AndroidStudio&Kotlin安装到运行过程及常见问题汇总
- AndroidStudio3.6的卸载安装,Gradle持续下载/Gradle Build失败等问题
- 搭建DNSmasq简单教程带WEB管理面板
- Android Studio报错unable to access android sdk add-on list解决方案
- 自建的纯净dns服务拦截部分广告,南方推荐
- Nginx安装lua-nginx-module模块
- IPinfo 多接口IP查询工具源码
- 教你CentOS7下如何更换内核安装BBR加速
- we-extract解析和采集微信公众号文章的账号及内容必备工具
- android九宫格可分页加载控件使用详解