使用SqlServer2005 Service Broker 和 SqlDependency类提供数据更改的通知

 /*注意
         * 使用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();
        }
View Code

上述事件引用方法

  /// <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);
        }
View Code

检测数据库数据的变化

 /// <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];
            }
        }
View Code


 

原文地址:https://www.cnblogs.com/zxd543/p/3957729.html