SqlDependency实现实时监控SqlServer表的变化

本文介绍了一个使用SqlDependency实现实时监控SqlServer表变化的示例代码。需开启ServiceBroker服务,提供两种监听多表变化的方法:多线程加互斥锁或创建多个数据库连接。代码演示了如何注册监听并输出表中新增数据。

 该代码为使用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();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值