解决方案 »

  1.   

    两个是指StartDependency函数在多线程中运行2次?
      

  2.   

    #region feilunx    /// <summary>
        /// 
        /// </summary>
        public class SQLServiceBroker
        {        private string connectionStr = new DAL.DBSQL().returnCONN();        // private string sqlStr = "";
            public string sqlStr { get; set; }
            private SqlConnection connection = null;        public delegate void UIDelegate1();        private UIDelegate1 uidel = null;        public Form form = null;        /// <summary>
            /// 
            /// </summary>
            /// <param name="TableName"></param>
            /// <param name="ColumnNames"></param>
            public SQLServiceBroker(string TableName, List<string> ColumnNames)
            {
                string columns = "";
                foreach (string str in ColumnNames)
                {
                    if (columns != "")
                        columns = columns + ",";
                    columns = columns + "[" + str + "]";
                }
                this.sqlStr = string.Format("select {0} From [dbo].[{1}]", columns, TableName);
            }        /// <summary>
            /// 
            /// </summary>
            /// <param name="constr"></param>
            /// <param name="TableName"></param>
            /// <param name="ColumnNames"></param>
            public SQLServiceBroker(string constr, string TableName, List<string> ColumnNames)
                : this(TableName, ColumnNames)
            {
                this.connectionStr = new DAL.DBSQL().returnCONN();
            }        /// <summary>
            /// 
            /// </summary>
            ~SQLServiceBrokerBaoJTS()
            {
                StopDependency();
                connection.Dispose();
            }        /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public bool EnoughPermission()
            {            SqlClientPermission perm = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
                try
                {
                    perm.Demand();
                    return true;
                }
                catch (System.Exception)
                {
                    return false;
                }
            }        /// <summary>
            /// 
            /// </summary>
            /// <param name="uidelegate"></param>
            public void InitDependency(UIDelegate1 uidelegate)
            {            SqlDependency.Stop(connectionStr);
                SqlDependency.Start(connectionStr);
                if (connection == null)
                    connection = new SqlConnection(connectionStr);            if (!EnoughPermission())
                    throw new Exception("没有权限(SqlClientPermission)!");
                if (uidelegate == null)
                    throw new Exception("回调方法未指定(UIDelegate)!");
                if (connection == null)
                    throw new Exception("未初始化(InitDependency)!");
                this.uidel = uidelegate;        }        /// <summary>
            /// 传入窗体对象,以防止委托有需要访问UI层控件是引发的“从不是创建控件的线程访问它”
            /// </summary>
            /// <param name="form1"></param>
            /// <param name="uidelegate"></param>
            public void InitDependency(Form form1, UIDelegate1 uidelegate)
            {
                InitDependency(uidelegate);
                this.form = form1;
            }        /// <summary>
            /// 启动
            /// </summary>
            public void StartDependency()
            {
                //这里很奇怪,每次都需要新的command对象
                using (SqlCommand command = new SqlCommand(sqlStr, connection))
                {
                    command.Notification = null;
                    SqlDependency dependency = new SqlDependency(command);
                    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
                    if (connection.State != ConnectionState.Open)
                        connection.Open();
                    command.ExecuteNonQuery();
                    command.Dispose();
                }
            }        /// <summary>
            /// 
            /// </summary>
            public void StopDependency()
            {
                SqlDependency.Stop(connectionStr);
                if (connection != null)
                    connection.Close();
            }        /// <summary>
            /// 
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
            {
                //注销监测事件
                SqlDependency dependency = (SqlDependency)sender;
                dependency.OnChange -= dependency_OnChange;
                //放在移除事件之后又很大必要,防止ui层调用更新相同表时,进入循环出发调用
                //uidel.Invoke();
                //uidel();
                //使用from.Invoke调用防止访问界面控件引发“从不是创建控件的线程访问它”
                if (form != null)
                    form.Invoke(uidel);
                else
                    uidel();
                //再次启动监听
                StartDependency();
            }
        }
        #endregion这个监听的类  /// <summary>
            /// 启动监听
            /// </summary>
            /// <param name="list"></param>
            /// <param name="tabname"></param>
            public void QiDongJTSJ(List<string> list, string tabname)
            {
                try
                {
                    SQLServiceBrokerDaPshij broker = new SQLServiceBrokerDaPshij(tabname, list);
                    //实例化毁掉函数
                    SQLServiceBrokerDaPshij.UIDelegate4 uidel = new SQLServiceBrokerDaPshij.UIDelegate4(writeCons);
                    //初始化,及传入回调函数
                    broker.InitDependency(uidel);
                    //初始化,传入窗体对象对于需要委托中访问ui控件的情况
                    broker.InitDependency(this, uidel);
                    //启动监听
                    broker.StartDependency();
                }
                catch (Exception)
                {
                }
    }
    调用启动···
      List<string> listr = new List<string>();
                listr.Add("no");
                listr.Add("Reviewstatus");
                QiDongJTSJ(listr, "T_Alarmandevent");
      

  3.   

    #region feilunx    /// <summary>
        /// 
        /// </summary>
        public class SQLServiceBroker
        {        private string connectionStr = new DAL.DBSQL().returnCONN();        // private string sqlStr = "";
            public string sqlStr { get; set; }
            private SqlConnection connection = null;        public delegate void UIDelegate1();        private UIDelegate1 uidel = null;        public Form form = null;        /// <summary>
            /// 
            /// </summary>
            /// <param name="TableName"></param>
            /// <param name="ColumnNames"></param>
            public SQLServiceBroker(string TableName, List<string> ColumnNames)
            {
                string columns = "";
                foreach (string str in ColumnNames)
                {
                    if (columns != "")
                        columns = columns + ",";
                    columns = columns + "[" + str + "]";
                }
                this.sqlStr = string.Format("select {0} From [dbo].[{1}]", columns, TableName);
            }        /// <summary>
            /// 
            /// </summary>
            /// <param name="constr"></param>
            /// <param name="TableName"></param>
            /// <param name="ColumnNames"></param>
            public SQLServiceBroker(string constr, string TableName, List<string> ColumnNames)
                : this(TableName, ColumnNames)
            {
                this.connectionStr = new DAL.DBSQL().returnCONN();
            }        /// <summary>
            /// 
            /// </summary>
            ~SQLServiceBrokerBaoJTS()
            {
                StopDependency();
                connection.Dispose();
            }        /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public bool EnoughPermission()
            {            SqlClientPermission perm = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
                try
                {
                    perm.Demand();
                    return true;
                }
                catch (System.Exception)
                {
                    return false;
                }
            }        /// <summary>
            /// 
            /// </summary>
            /// <param name="uidelegate"></param>
            public void InitDependency(UIDelegate1 uidelegate)
            {            SqlDependency.Stop(connectionStr);
                SqlDependency.Start(connectionStr);
                if (connection == null)
                    connection = new SqlConnection(connectionStr);            if (!EnoughPermission())
                    throw new Exception("没有权限(SqlClientPermission)!");
                if (uidelegate == null)
                    throw new Exception("回调方法未指定(UIDelegate)!");
                if (connection == null)
                    throw new Exception("未初始化(InitDependency)!");
                this.uidel = uidelegate;        }        /// <summary>
            /// 传入窗体对象,以防止委托有需要访问UI层控件是引发的“从不是创建控件的线程访问它”
            /// </summary>
            /// <param name="form1"></param>
            /// <param name="uidelegate"></param>
            public void InitDependency(Form form1, UIDelegate1 uidelegate)
            {
                InitDependency(uidelegate);
                this.form = form1;
            }        /// <summary>
            /// 启动
            /// </summary>
            public void StartDependency()
            {
                //这里很奇怪,每次都需要新的command对象
                using (SqlCommand command = new SqlCommand(sqlStr, connection))
                {
                    command.Notification = null;
                    SqlDependency dependency = new SqlDependency(command);
                    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
                    if (connection.State != ConnectionState.Open)
                        connection.Open();
                    command.ExecuteNonQuery();
                    command.Dispose();
                }
            }        /// <summary>
            /// 
            /// </summary>
            public void StopDependency()
            {
                SqlDependency.Stop(connectionStr);
                if (connection != null)
                    connection.Close();
            }        /// <summary>
            /// 
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
            {
                //注销监测事件
                SqlDependency dependency = (SqlDependency)sender;
                dependency.OnChange -= dependency_OnChange;
                //放在移除事件之后又很大必要,防止ui层调用更新相同表时,进入循环出发调用
                //uidel.Invoke();
                //uidel();
                //使用from.Invoke调用防止访问界面控件引发“从不是创建控件的线程访问它”
                if (form != null)
                    form.Invoke(uidel);
                else
                    uidel();
                //再次启动监听
                StartDependency();
            }
        }
        #endregion这个监听的类  /// <summary>
            /// 启动监听
            /// </summary>
            /// <param name="list"></param>
            /// <param name="tabname"></param>
            public void QiDongJTSJ(List<string> list, string tabname)
            {
                try
                {
                    SQLServiceBrokerDaPshij broker = new SQLServiceBrokerDaPshij(tabname, list);
                    //实例化毁掉函数
                    SQLServiceBrokerDaPshij.UIDelegate4 uidel = new SQLServiceBrokerDaPshij.UIDelegate4(writeCons);
                    //初始化,及传入回调函数
                    broker.InitDependency(uidel);
                    //初始化,传入窗体对象对于需要委托中访问ui控件的情况
                    broker.InitDependency(this, uidel);
                    //启动监听
                    broker.StartDependency();
                }
                catch (Exception)
                {
                }
    }
    调用启动···
      List<string> listr = new List<string>();
                listr.Add("no");
                listr.Add("Reviewstatus");
                QiDongJTSJ(listr, "T_Alarmandevent");我怕出现问题,我每一个监听都查询写了一个类, 就类名不一样,其他差不多,   当一起调用启动时,第一个启动不能监听,第二个才能 
                List<string> listr = new List<string>();
                listr.Add("no");
                listr.Add("Reviewstatus");
                QiDongJTSJ(listr, "T_Alarmandevent");
                List<string> lst = new List<string>();
                lst.Add("Reviewstatus");
                QiDongJTSHB(lst, "T_Audittable");
      
       现在能监听的是  T_Audittable 表, T_Alarmandevent 表不能监听···
      

  4.   

    请不要同一段代码贴2遍,看的别人眼花缭乱了。另外用代码格式贴,不然格式太乱了。SQLServiceBroker类和SQLServiceBrokerDaPshij类的关系是什么?不建议用析构函数,那个什么时候执行都不知道。监听的事为做过,如果要查错,我可以提供些建议,利用SQLSERVER自带的监视工具,查看实际执行的内容和产生的连接,有可能是两个监听共享了同一个连接导致的。