使用SqlDependency来监听某个数据表中列的实时变化

现在项目中有个配置保存在数据库表中,需要监听那个数据库中那个表中列的变化.

实现思路大概两种,一种你时时刻刻都去'问'数据库你有没有改变.另一种数据库变化后我告诉你.

前者可以在web项目中的Global文件中添加线程轮询来实现,但是我发现部署到IIS一段时间后就失效了,

现在用SqlDependency来后者,类似监听功能

首先上web项目中的代码

protected void Application_Start()
        {
            string con=ConfigurationManager.AppSettings["constr"].ToString();//这里是连接字符串
            bool aa=SqlDependency.Start(con);//开启监听 返回监听是否成功
            Update(con);
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

        protected void Application_End(object sender, EventArgs e)
        {
            //关闭的时候监听也关闭
            System.Data.SqlClient.SqlDependency.Stop(ConfigurationManager.AppSettings["constr"].ToString());
        }

        private static void Update(string conn)
        {
            using (SqlConnection connection = new SqlConnection(conn))
            {
                //依赖是基于某一张表的,而且查询语句只能是简单查询语句,不能带top或*,同时必须指定所有者,即类似[dbo].[]
                using (SqlCommand command = new SqlCommand(" SELECT [IsEnable] FROM dbo.Settings WHERE [ID]=1 ", connection))
                {
                    command.CommandType = CommandType.Text;
                    connection.Open();
                    SqlDependency dependency = new SqlDependency(command);
                    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
                    SqlDataReader sdr = command.ExecuteReader();

                    Console.WriteLine();

                    while (sdr.Read())
                    {
                        string a = sdr["IsEnable"].ToString();
                    }
                    connection.Close();
                }

            }
        }

        //update insert delete都会进入
        private static void dependency_OnChange(object sender, SqlNotificationEventArgs e)
        {
            if (e.Type==SqlNotificationType.Change)
            {
                Console.WriteLine("自定义修改内容");
                //这里可以随意定义监听的值修改后代码
                SqlConnection connection = new SqlConnection(ConfigurationManager.AppSettings["constr"].ToString());
                SqlCommand command = new SqlCommand("insert into [log] values(2,'值有变动',GETDATE(),GETDATE())", connection);
                connection.Open();
                command.ExecuteNonQuery();
                connection.Close();
                Update(ConfigurationManager.AppSettings["constr"].ToString());
            }
            
        }

SQLserver数据库需要启动代理

use 你的数据库名字
go  
--//设置某个数据库代理的回滚
ALTER DATABASE 你的数据库名字SET NEW_BROKER WITH ROLLBACK IMMEDIATE; 

-- //设置某个数据库的代理
ALTER DATABASE 你的数据库名字SET ENABLE_BROKER; 

  还需要设置

--数据库右击->属性->文件->选择数据库所有者->选择[sa]-- ok。

猜你喜欢

转载自www.cnblogs.com/tabai/p/12917464.html
今日推荐