使用SqlDependency监听MSSQL数据库表变化通知
SqlDependency提供了这样一种机制,当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的。
首先要对数据库进行配置,配置命令如下:
1.启用Service Broker并查看是否启用成功,is_broker_enabled为1则表明启用成功:
ALTER DATABASE SqlDepTest SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE SqlDepTest SET ENABLE_BROKER;
SELECT is_broker_enabled FROM sys.databases WHERE name = 'SqlDepTest'
2.开启帐号订阅权限,由于sa帐号不支持权限设置,所以需要建立单独的帐号。
use master
GRANT CREATE PROCEDURE TO sqldep
GRANT CREATE QUEUE TO sqldep
GRANT CREATE SERVICE TO sqldep
use master
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO sqldep
exec sp_helprotect NULL, sqldep
C#示例代码如下:
- private const string SQL_CONNECTIONSETTINGS = "";
- static void Main(string[] args)
- {
- //传入连接字符串,启动基于数据库的监听
- SqlDependency.Start(SQL_CONNECTIONSETTINGS);
- HandleMessage();
- Console.Read();
- }
- /// <summary>
- /// 触发处理消息机制
- /// </summary>
- private static void HandleMessage()
- {
- using (SqlConnection connection = new SqlConnection(SQL_CONNECTIONSETTINGS))
- {
- //依赖是基于某一张表的,而且查询语句只能是简单查询语句,不能带top或*,同时必须指定所有者,即类似[dbo].[]
- using (SqlCommand command = new SqlCommand("SELECT [MessageID],[Messages],[CreateTime] FROM [dbo].[Messages]", connection))
- {
- int messageID = 0;
- command.CommandType = CommandType.Text;
- connection.Open();
- command.Notification = null;
- SqlDependency dependency = new SqlDependency(command);
- dependency.OnChange += new OnChangeEventHandler(Dependency_OnChange);
- SqlDataReader sdr = command.ExecuteReader();
- while (sdr.Read())
- {
- int.TryParse(sdr["MessageID"].ToString(), out messageID);
- ProcessMessage(messageID);
- Console.WriteLine("MessageID:{0}\tMessages:{1}\tCreateTime:\t{2}", sdr["MessageID"].ToString(), sdr["Messages"].ToString(), sdr["CreateTime"].ToString());
- CompleteProcessMessage(messageID, 2);
- }
- sdr.Close();
- }
- }
- }
- /// <summary>
- /// SQL消息触发事件
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private static void Dependency_OnChange(object sender, SqlNotificationEventArgs e)
- {
- SqlDependency dependency = sender as SqlDependency;
- dependency.OnChange -= Dependency_OnChange;
- HandleMessage();
- }
- /// <summary>
- /// 处理消息
- /// </summary>
- /// <param name="messageID">消息编号</param>
- private static void ProcessMessage(int messageID)
- {
- using (SqlConnection connection = new SqlConnection(SQL_CONNECTIONSETTINGS))
- {
- string sql = string.Format(@"INSERT INTO [dbo].[MessagesComplete]
- SELECT [MessageID],[Messages],1,[CreateTime],GETDATE()
- FROM [dbo].[Messages] WHERE [MessageID] = {0}
- DELETE FROM [dbo].[Messages] WHERE [MessageID] = {0}", messageID);
- using (SqlCommand command = new SqlCommand(sql, connection))
- {
- command.CommandType = CommandType.Text;
- connection.Open();
- command.ExecuteNonQuery();
- command.Dispose();
- }
- }
- }
- /// <summary>
- /// 消息处理完成,更新消息处理状态
- /// </summary>
- /// <param name="messageID">消息编号</param>
- /// <param name="status">状态:1.处理中,2.处理完成,-1.处理失败</param>
- private static void CompleteProcessMessage(int messageID, int status)
- {
- using (SqlConnection connection = new SqlConnection(SQL_CONNECTIONSETTINGS))
- {
- string sql = string.Format("UPDATE [dbo].[MessagesComplete] SET [Status] = {1} WHERE [MessageID] = {0}", messageID, status);
- using (SqlCommand command = new SqlCommand(sql, connection))
- {
- command.CommandType = CommandType.Text;
- connection.Open();
- command.ExecuteNonQuery();
- command.Dispose();
- }
- }
- }
使用SqlDependency监听MSSQL数据库表变化通知的更多相关文章
- 【Android开发】监听图库数据库的变化
步骤一: 保存图片或者删除之前,初始化ContentObserver ScreenshotContentObserver mScreenObserver = new ScreenshotContent ...
- 老技术记录-C#+SqlServer使用SqlDependency监听数据库表变化
开发环境: .net / C# (.net core理论上也可以) 数据库:MS SQL Server 2005 以上 (我用的sqlserver2012) 功能:SqlDependency提供了一种 ...
- js监听input等表单输入框的变化事件oninput
js监听input等表单输入框的变化事件oninput,手机页面开发中使用到文本框textarea输入字符监听文本框变化计算还可以输入多少字符,如果使用onkeyup的话是无法监听到输入法输入的文本变 ...
- js 实时监听input中值变化
注意:用到了jquery需要引入jquery.min.js. 需求: 1.每个地方需要分别打分,总分为100; 2.第一个打分总分为40; 3.第二个打分总分为60. 注意:需要判断null.&quo ...
- javascript --- 实时监听输入框值的变化
实时监听文本框值变化是非常常见的功能,通常最简单的办法就是用keyup,keydown来实现,但是这种方法有两个问题,一个是当直接复制粘贴的时候没法监听到事件,另外一个问题是在移动端,使用删除键删除输 ...
- linux下oracle11g R2的启动与关闭监听、数据库
su - oracle 切换到oracle账户 lsnrctl start 启动监听 sqlplus /nolog 登陆sqlplus conn /as ...
- Android监听WIFI网络的变化并且获得当前信号强度
MainActivity如下: package cc.testwifi; import android.os.Bundle; import android.app.Activity; /** * De ...
- js监听文本框值变化事件,就oninput & onpropertychange & onkeyup & onchange的区别
在Web前端项目中实时监听文本框的值变化是非常常见的功能,通常最简单最容易想到的是onkeyup和onchange事件,但是在使用onkeyup来监听键盘事件的时候,监听不到鼠标右键的粘贴.复制的操作 ...
- 用jquery监听输入数字的变化
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
随机推荐
- 这一次,我连 web.xml 都不要了,纯 Java 搭建 SSM 环境!
在 Spring Boot 项目中,正常来说是不存在 XML 配置,这是因为 Spring Boot 不推荐使用 XML ,注意,并非不支持,Spring Boot 推荐开发者使用 Java 配置来搭 ...
- querySelector和getElementById之间的区别
一.概述 今天在看js的时候发现里面的代码基本上都是用querySelector()和querySelectorAll()来获取元素,就有点疑惑为什么不用getElementById(),可能也是因为 ...
- POJ 3321 Apple Tree 树状数组+DFS
题意:一棵苹果树有n个结点,编号从1到n,根结点永远是1.该树有n-1条树枝,每条树枝连接两个结点.已知苹果只会结在树的结点处,而且每个结点最多只能结1个苹果.初始时每个结点处都有1个苹果.树的主人接 ...
- 转:java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例
java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例 1.CountDownLatch:一个同步工具类,它允许一个或多个线程一 ...
- 防止ddos攻击
1.防止ddos攻击 :接入层过滤器,去判断非法请求ip地主(如果请求过多,自己加入黑名单),上传至防火墙黑名单,不再录入 2.防止xss/css攻击 :在接入层,有第三方jra包工具类,过滤所有请求
- IOS 暂停和恢复CALayer上的动画(转)
coreAnimation的动画是存在于CALayer上面的,有些时候需要突然暂停某个组件的动画效果,同时保留当前动画的状态, 如果是用removeAnimation会显得很突兀,不够平滑,所以可以利 ...
- vps
vps是指虚拟专用服务器(Virtual Private Servers),等同于一台远程计算机,有独立的IP地址,全天24小时不关机,可以部署博客.应用.服务 ***简称SS,可以用来搭建FQ服务器 ...
- linux下怎样对串口编程
Linux操作系统从一開始就对串行口提供了非常好的支持,本文就Linux下的串行口通讯编程进行简单的介绍. 串口简单介绍串行口是计算机一种经常使用的接口.具有连接线少.通讯简单.得到广泛的使用. 经常 ...
- foreach_break 面试记录
版权所有@foreach_break] [博客地址 http://www.cnblogs.com/foreach-break] 可以转载,但必须注明出处并保持博客超链接 背景 自从2013年离开北京后 ...
- apache的配置优化
[APACHE的工作方式] prefork模式(默认)这个多路处理模块(MPM)实现了一个非线程型的.预派生的web服务器,它的工作方式类似于Apache 1.3.它适合于没有线程安全库,需要避免线程 ...