该代码为使用SqlDependency实现实时监控SqlServer表变化的demo,注意数据库需要开启ServiceBroker服务,开启方法很简单,自行百度即可。
如果想要监听数据库中的多个表的变化,有两个方法。
方法一,使用多线程。每个表开一个线程,由于一个连接只能被一个SqlDataReader使用,因此需要加互斥锁;或者使用SqlDataAdapter。
方法二,创建多个数据库连接。
//以下两个全局变量的作用是控制输出,只输出表中新增加的数据
private static int flag = -1;
private static bool isListen = false;
//连接sqlserver
public static void connectSqlServer()
{
conn = new SqlConnection(连接字符串);
conn.Open();
if (conn.State == ConnectionState.Closed)
{
Console.WriteLine("连接失败!");
}
else if (conn.State == ConnectionState.Open)
{
Console.WriteLine("连接成功!");
}
}
//注册监听
public static void registerListen()
{
int cnt = 0;//控制输出
try{
//SqlDependency只能使用简单sql语句,并且需要在表名前加dbo
string strqry = "select id,_NAME,_VALUE from dbo.student";
SqlCommand cmd = new SqlCommand(strqry, connectSqlServer());
SqlDependency dependency = new SqlDependency(cmd);
dependency.OnChange -= new OnChangeEventHandler(Dependency_OnChange);
dependency.OnChange += new OnChangeEventHandler(Dependency_OnChange);
SqlDataReader sdr = cmd.ExecuteReader();
while (sdr.Read())
{
cnt++;
if(isListen)
{
if (cnt > flag)
{
flag = cnt;
string value = sdr["value"].ToString();
Console.WriteLine( DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " student表新增信息:" + value);
}
}
else
{
flag = cnt;
}
}
sdr.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
private static void Dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
//只有数据发生变化时,才重新获取数据
//if (e.Type == SqlNotificationType.Change)
//{
//SelectData();
//Console.WriteLine("数据库发生变化 " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
//}
isListen = true;
registerListen();
}