使用 SqlDependency 来监听数据库某个表的改变.

2019-11-29  本文已影响0人  人话博客

现在有这么个需求:

有一个标准的前后端,搭配数据库的一个应用.

但是这个应用不是你写的.

但是数据库你是可以连接的.

也就是说,这个应用产生的数据,你可以连接数据库,然后通过 select 语句去查看数据的变化.

有没有什么办法,让我不去修改别人写的应用,也能及时的检测到这个应用有数据的变化呢???

比如别人写的这个应用插入了一条用户记录,你想在插入这条数据之后,通知自己后台: 嘿!那个应用有条新数据被插入了!你赶紧从那个应用的数据库里,把最新的数据拉过来!

使用 SqlDependency 来监听数据库(某张表的变化)


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;

namespace SQL {

    /// <summary>
    /// SQL 监听
    /// </summary>
    class Program {

        // 数据库连接字符串
        const string Conn_String = "Data Source=.;Initial Catalog=znykt_Auto;Integrated Security=False;User ID=sa;Password=1qaz2wsx;Connect Timeout=15;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False";

        static void Main(string[] args) {
            SqlDependency.Start(Conn_String); // 连接指定数据库病打开监听

            DataMonitor(); // 开启数据库监控 


            Console.ReadKey();
        }


        static void DataMonitor () {
            using (SqlConnection connection = new SqlConnection(Conn_String)) {

                using (SqlCommand cmd = new SqlCommand("SELECT ID,CardNO,CPH, CardType,InTime, OutTime,InGateName FROM dbo.MYRECORDMEMORY", connection)) {

                    cmd.CommandType = CommandType.Text;
                    if (connection.State == ConnectionState.Closed) {
                        connection.Open();
                    }

                    SqlDependency dependency = new SqlDependency(cmd);
                    dependency.OnChange += Dependency_OnChange;

                    SqlDataReader reader = cmd.ExecuteReader();

                    if (!reader.HasRows) return;

                    while (reader.Read()) {
                        Console.WriteLine(string.Format("Id:{0} CardNo:{1}, CPH:{2} CardType: {3} InTime:{4} outTime:{5} InGateName:{6}",
                            reader["Id"].ToString(),
                            reader["CardNo"].ToString(),
                            reader["CPH"].ToString(),
                            reader["CardType"].ToString(),
                            reader["InTime"].ToString(),
                            reader["OutTime"].ToString(),
                            reader["InGateName"].ToString()
                            ));
                    }

                    reader.Close();
                }
            }
        }

        // 当依赖的表格发生数据改变时触发
        private static void Dependency_OnChange(object sender, SqlNotificationEventArgs e) {
            Console.Clear();
            Console.WriteLine("有数据改变了!!!!");
            // 
            DataMonitor();

            // 给 Java 后台发送信息
            PostMessageToJava();
        }

        /// <summary>
        /// 给 Java 后台发送信息.
        /// </summary>
        private static void PostMessageToJava() {
            throw new NotImplementedException();
        }
    }
}

注意说明:

  1. Conn_Str 连接字符串就是别人写的应用使用到的数据库.

  2. 我们要监听这个数据库的变化,所有连接字符串就是这个.

  3. 通过 SqlDependency 来监听即可.(变化的监听是基于某张表的,而不是整个数据库.多张表,你就多写几个SqlDependency)

  4. 可以观察到 SqlDependency dependency = new SqlDependency(cmd); , 表示,检测对象也是需要向 SQL 服务发送查询语句的.

  5. cmd 的 命令语句是 ELECT ID,CardNO,CPH, CardType,InTime, OutTime,InGateName FROM dbo.MYRECORDMEMORY ,是一条查询语句(废话,查看变化肯定是查询语句) ---> 注意: 不能使用 top,*等,必须显示指定需要查询的字段. 还有一个表名的指定必须加 dbo. 前缀.

  6. dependency.OnChange += Dependency_OnChange; 当cmd的查询语句发生对应的表里(这里是MYRECORDMEMEORY)数据发生改变时,就会触发 Dependency_OnChange 的方法. 即可监听到数据库对应表的数据改变了.

上一篇下一篇

猜你喜欢

热点阅读