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

摘要:
实现步骤:1.在数据库中启用Service Broker。检查数据库_ Broker_enabledFROMsys中是否启用了Service Broker SELECTIS。DatabasesWHERE Name='数据库名称'查询结果:is_ broker_ enabledde的结果为0,这意味着数据库未启动Service broker解决方案:使用数据库名称goALTERDATABASE数据库名称SETNEW_ BROKERWITHROLLBACKIMEDIATE;ALTERDATABASE数据库名称SETENABLE_ BROKER;注意:如果这两个句子同时执行,如果这两句话分别执行,将显示消息“回滚非法交易。估计回滚完成:100%”。查询再次出现_ broker_启用状态为1。数据库未能成功启动Service broker。

开发环境: .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");
        }

    }

免责声明:文章转载自《老技术记录-C#+SqlServer使用SqlDependency监听数据库表变化》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇vuex : 模块化改造MySQL5.7 虚拟列实现表达式或函数索引下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Mongodb学习总结(2)——MongoDB与MySQL区别及其使用场景对比

对于只有SQL背景的人来说,想要深入研究NoSQL似乎是一个艰巨的任务,MySQL与MongoDB都是开源常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL数据库。它们各有优点,关键看用在什么地方。 什么情况下,MongoDB是最好的选择? 很多人认为MongoDB难以置信的强大,是一个可扩...

数据仓库基础(七)Informatica PowerCenter介绍

 Infromatica PowerCenter介绍: 1993年在美国加利福尼亚州成立,一年后在美国纳斯达克上市。 informatica的特点:1.强大的多种数据类型访问能力 2.企业级的数据集成解决方案 3.强大的ETL功能 Infromatica PowerCenter工具概况 主要有一下几部分组成: 1.Administration Consol...

ubuntu apt 安装mysql 5.7

Ubuntu上安装MySQL非常简单只需要几条命令就可以完成。 1. sudo apt-get install mysql-server 2. apt-get isntall mysql-client 3. sudo apt-get install libmysqlclient-dev 安装过程中会提示设置密码什么的,注意设置了不要忘了,安装完成之后可以使...

多租户实现之基于Mybatis,Mycat的共享数据库,共享数据架构

前言 SaaS模式是什么? 传统的软件模式是在开发出软件产品后,需要去客户现场进行实施,通常部署在局域网,这样开发、部署及维护的成本都是比较高的。 现在随着云服务技术的蓬勃发展,就出现了SaaS模式。 所谓SaaS模式即是把产品部署在云服务器上,从前的客户变成了“租户”,我们按照功能和租用时间对租户进行收费。 这样的好处是,用户可以按自己的需求来购买功...

weblogic 的应用链接不上数据库报异常 Caused By: weblogic.common.ResourceException: Io exception: Connection reset 错误信息表示访问数据库异常,创建链接池失败

保存信息如下: weblogic.application.ModuleException:at weblogic.jdbc.module.JDBCModule.prepare(JDBCModule.java:290)at weblogic.application.internal.flow.ModuleListenerInvoker.prepare(Mod...

android 开发进程 0.37 room数据存储的使用

room数据存储简介 room 是jetpack库中的一个数据持久化库,底层还是使用的SQLite的实现方式。但使用方式更加简单,原生的SQLite方法较为繁琐,room使用的是实体类和数据库表映射的方式。更为简洁易懂。   room数据库导入 在module的gradle中添加: def room_version = "2.3.0" // che...