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#示例代码如下:

    1. private const string SQL_CONNECTIONSETTINGS = "";
    2. static void Main(string[] args)
    3. {
    4. //传入连接字符串,启动基于数据库的监听
    5. SqlDependency.Start(SQL_CONNECTIONSETTINGS);
    6. HandleMessage();
    7. Console.Read();
    8. }
    9. /// <summary>
    10. /// 触发处理消息机制
    11. /// </summary>
    12. private static void HandleMessage()
    13. {
    14. using (SqlConnection connection = new SqlConnection(SQL_CONNECTIONSETTINGS))
    15. {
    16. //依赖是基于某一张表的,而且查询语句只能是简单查询语句,不能带top或*,同时必须指定所有者,即类似[dbo].[]
    17. using (SqlCommand command = new SqlCommand("SELECT [MessageID],[Messages],[CreateTime] FROM [dbo].[Messages]", connection))
    18. {
    19. int messageID = 0;
    20. command.CommandType = CommandType.Text;
    21. connection.Open();
    22. command.Notification = null;
    23. SqlDependency dependency = new SqlDependency(command);
    24. dependency.OnChange += new OnChangeEventHandler(Dependency_OnChange);
    25. SqlDataReader sdr = command.ExecuteReader();
    26. while (sdr.Read())
    27. {
    28. int.TryParse(sdr["MessageID"].ToString(), out messageID);
    29. ProcessMessage(messageID);
    30. Console.WriteLine("MessageID:{0}\tMessages:{1}\tCreateTime:\t{2}", sdr["MessageID"].ToString(), sdr["Messages"].ToString(), sdr["CreateTime"].ToString());
    31. CompleteProcessMessage(messageID, 2);
    32. }
    33. sdr.Close();
    34. }
    35. }
    36. }
    37. /// <summary>
    38. /// SQL消息触发事件
    39. /// </summary>
    40. /// <param name="sender"></param>
    41. /// <param name="e"></param>
    42. private static void Dependency_OnChange(object sender, SqlNotificationEventArgs e)
    43. {
    44. SqlDependency dependency = sender as SqlDependency;
    45. dependency.OnChange -= Dependency_OnChange;
    46. HandleMessage();
    47. }
    48. /// <summary>
    49. /// 处理消息
    50. /// </summary>
    51. /// <param name="messageID">消息编号</param>
    52. private static void ProcessMessage(int messageID)
    53. {
    54. using (SqlConnection connection = new SqlConnection(SQL_CONNECTIONSETTINGS))
    55. {
    56. string sql = string.Format(@"INSERT INTO [dbo].[MessagesComplete]
    57. SELECT [MessageID],[Messages],1,[CreateTime],GETDATE()
    58. FROM [dbo].[Messages] WHERE [MessageID] = {0}
    59. DELETE FROM [dbo].[Messages] WHERE [MessageID] = {0}", messageID);
    60. using (SqlCommand command = new SqlCommand(sql, connection))
    61. {
    62. command.CommandType = CommandType.Text;
    63. connection.Open();
    64. command.ExecuteNonQuery();
    65. command.Dispose();
    66. }
    67. }
    68. }
    69. /// <summary>
    70. /// 消息处理完成,更新消息处理状态
    71. /// </summary>
    72. /// <param name="messageID">消息编号</param>
    73. /// <param name="status">状态:1.处理中,2.处理完成,-1.处理失败</param>
    74. private static void CompleteProcessMessage(int messageID, int status)
    75. {
    76. using (SqlConnection connection = new SqlConnection(SQL_CONNECTIONSETTINGS))
    77. {
    78. string sql = string.Format("UPDATE [dbo].[MessagesComplete] SET [Status] = {1} WHERE [MessageID] = {0}", messageID, status);
    79. using (SqlCommand command = new SqlCommand(sql, connection))
    80. {
    81. command.CommandType = CommandType.Text;
    82. connection.Open();
    83. command.ExecuteNonQuery();
    84. command.Dispose();
    85. }
    86. }
    87. }

使用SqlDependency监听MSSQL数据库表变化通知的更多相关文章

  1. 【Android开发】监听图库数据库的变化

    步骤一: 保存图片或者删除之前,初始化ContentObserver ScreenshotContentObserver mScreenObserver = new ScreenshotContent ...

  2. 老技术记录-C#+SqlServer使用SqlDependency监听数据库表变化

    开发环境: .net / C# (.net core理论上也可以) 数据库:MS SQL Server 2005 以上 (我用的sqlserver2012) 功能:SqlDependency提供了一种 ...

  3. js监听input等表单输入框的变化事件oninput

    js监听input等表单输入框的变化事件oninput,手机页面开发中使用到文本框textarea输入字符监听文本框变化计算还可以输入多少字符,如果使用onkeyup的话是无法监听到输入法输入的文本变 ...

  4. js 实时监听input中值变化

    注意:用到了jquery需要引入jquery.min.js. 需求: 1.每个地方需要分别打分,总分为100; 2.第一个打分总分为40; 3.第二个打分总分为60. 注意:需要判断null.&quo ...

  5. javascript --- 实时监听输入框值的变化

    实时监听文本框值变化是非常常见的功能,通常最简单的办法就是用keyup,keydown来实现,但是这种方法有两个问题,一个是当直接复制粘贴的时候没法监听到事件,另外一个问题是在移动端,使用删除键删除输 ...

  6. linux下oracle11g R2的启动与关闭监听、数据库

    su - oracle           切换到oracle账户 lsnrctl start          启动监听 sqlplus /nolog     登陆sqlplus conn /as  ...

  7. Android监听WIFI网络的变化并且获得当前信号强度

    MainActivity如下: package cc.testwifi; import android.os.Bundle; import android.app.Activity; /** * De ...

  8. js监听文本框值变化事件,就oninput & onpropertychange & onkeyup & onchange的区别

    在Web前端项目中实时监听文本框的值变化是非常常见的功能,通常最简单最容易想到的是onkeyup和onchange事件,但是在使用onkeyup来监听键盘事件的时候,监听不到鼠标右键的粘贴.复制的操作 ...

  9. 用jquery监听输入数字的变化

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

随机推荐

  1. C++ primer分章节快速回顾

    第三章: 1,sozeof(int): int n_int=INT_MAX; sizeof n_int;(对变量括号可选) 2,#include<climits>包含一些类型的最大值3,c ...

  2. Educational Codeforces Round 39 (Rated for Div. 2) B. Weird Subtraction Process[数论/欧几里得算法]

    https://zh.wikipedia.org/wiki/%E8%BC%BE%E8%BD%89%E7%9B%B8%E9%99%A4%E6%B3%95 取模也是一样的,就当多减几次. 在欧几里得最初的 ...

  3. git常用命令,制作缩写命令

    目录 基础命令 常用命令列表 查看状态 添加到本地仓库 推送到远程仓库 创建分支 更新分支, 合并分支 查看分支的差异 回滚 其它 缩写命令 基础命令 # 生成SSH key ssh-keygen - ...

  4. Android内存泄露自动检测神器LeakCanary

    经典的面试题: a.怎样在coding过程中避免内存泄露? b.怎样检测内存泄露? 这两个问题我想大部分Android 职位面试时都会被问到吧. 怎样避免就不赘述了,网上很多答案. 工具呢,当然也有很 ...

  5. PHP 5.4 中经 htmlspecialchars 转义后的中文字符串为空的问题

    PHP 5.4.3 环境中测试了一个在 PHP 5.2 环境下运行正常的程序,却发现本应正常提交一个中文字符串到数据库的代码却提交了一个空字符串,经过排查,该字符串在经 htmlspecialchar ...

  6. 关于<textarea>的内容中换行的表示方法

    <textarea>sdfsdfsffsd fer</textarea>

  7. selenium用法 (python)

    滑动到指定元素位置 browser.find_element_by_xpath("//font[text()='资产管理部经办人'][1]").location_once_scro ...

  8. VS2010 MFC中 静态编译设置方法

    问题:VS2010 c++编写的程序在别人的机子运行不了,缺少mfc100u.dll xxx100d.dll等 解决方法:1.将这些dll打包,和应用程序一起发布;2.采用MFC静态编译; 静态编译: ...

  9. http://blog.csdn.net/LANGXINLEN/article/details/50421988

    GitHub上史上最全的Android开源项目分类汇总 今天在看博客的时候,无意中发现了 @Trinea在GitHub上的一个项目 Android开源项目分类汇总, 由于类容太多了,我没有一个个完整地 ...

  10. .net 网站登录

    如何实现,按回车键,自动登录,在相应控件上添加onkeypress事件 function CheckCodePress(e){ var e = e||window.event if (e.keyCod ...