使用 SqlDependency 来监听数据库某个表的改变.
现在有这么个需求:
有一个标准的前后端,搭配数据库的一个应用.
但是这个应用不是你写的.
但是数据库你是可以连接的.
也就是说,这个应用产生的数据,你可以连接数据库,然后通过
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();
}
}
}
注意说明:
-
Conn_Str 连接字符串就是别人写的应用使用到的数据库.
-
我们要监听这个数据库的变化,所有连接字符串就是这个.
-
通过 SqlDependency 来监听即可.(变化的监听是基于某张表的,而不是整个数据库.多张表,你就多写几个SqlDependency)
-
可以观察到
SqlDependency dependency = new SqlDependency(cmd);
, 表示,检测对象也是需要向 SQL 服务发送查询语句的. -
cmd 的 命令语句是
ELECT ID,CardNO,CPH, CardType,InTime, OutTime,InGateName FROM dbo.MYRECORDMEMORY
,是一条查询语句(废话,查看变化肯定是查询语句) ---> 注意: 不能使用top
,*
等,必须显示指定需要查询的字段. 还有一个表名的指定必须加dbo.
前缀. -
dependency.OnChange += Dependency_OnChange;
当cmd的查询语句发生对应的表里(这里是MYRECORDMEMEORY)数据发生改变时,就会触发 Dependency_OnChange 的方法. 即可监听到数据库对应表的数据改变了.