/*注意
* 使用SqlServer2005 Service Broker 和 SqlDependency类提供数据更改的通知,注意一下几点
* 1.检测是否已经启用Service Broker
* Select DATABASEpRoPERTYEX('数据库名称','IsBrokerEnabled') -- 1 表示已经启用 0 表示没有启用
* 2.启用Service Broker
* ALTER DATABASE 数据库名称 SET ENABLE_BROKER;
* 3..给您的数据库访问帐号授予权限(sa除外,用其他帐号)
* GRANT SUBSCRIBE QUERY NOTIFICATIONS TO 账户
* 注意
* 使用 SqlDependency 订阅查询通知必须向SQL Server Service Broker提供制定规则的查询语句,
* 一般来讲,必须是简单的sql查询语句(不能用*,不能用top,不能用函数,包括聚合函数,不能用子查询,
* 包括where后的子查询,不能用外连接,自连接,不能用临时表,不能用变量,不能用视图,不能垮库,
* 表名之前必须加类似dbo数据库所有者这样的前缀)
*/
添加事件
//检测数据的变化 private static void dependency_OnChange(object sender, SqlNotificationEventArgs e) { InitJsonToDataTable(); }
上述事件引用方法
/// <summary> /// 第一次加载时候调用 /// </summary> public static void InitJsonToDataTable() { DataTable dtJSON = CheckJsonChange(); BindGridOrder(0); //传递一个方法,处理JSON转DataTable入库(应用数据字典详细找不见数据) //JSON json = new JSON(); //json.GetJSONDataTable(dtJSON); JsonToObjectClass jsonToObject = new JsonToObjectClass(); jsonToObject.GetJSONDataTable(dtJSON); }
检测数据库数据的变化
/// <summary> /// 检测数据库JSON数据的改变 /// </summary> private static DataTable CheckJsonChange() { //订单类型(Order:点餐) string Type = "Order"; //JSON数据状态(0:未处理,1:已经处理) int status = 0; string _connStr = DBUtility.PubConstant.ConnectionString; string _strSelect = "SELECT Type,JSON,chbId FROM [dbo].[chb_synLog] WHERE Type='" + Type + "' AND status="+status+" "; SqlDependency.Start(_connStr); using (SqlConnection conn = new SqlConnection(_connStr)) { DataSet ds = new DataSet(); try { conn.Open(); SqlCommand cmd = new SqlCommand(_strSelect, conn); SqlDependency dependency = new SqlDependency(cmd); dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); SqlDataAdapter sda = new SqlDataAdapter(cmd); sda.Fill(ds); } catch (System.Data.SqlClient.SqlException ex) { throw new Exception(ex.Message); } return ds.Tables[0]; } }