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

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

 

你可能感兴趣的:(.net,监听数据库)