现在项目中有个配置保存在数据库表中,需要监听那个数据库中那个表中列的变化.
实现思路大概两种,一种你时时刻刻都去‘问‘数据库你有没有改变.另一种数据库变化后我告诉你.
前者可以在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。