WPF非輪詢方式更新數據庫變化SqlDependency(數據庫修改前臺自動更新)

上一章節咱們講到wpf的柱狀圖組件,它包含了非輪詢方式更新數據庫變化SqlDependency的內容,可是沒有詳細解釋,如今給你們一個比較簡單的例子來講明這部份內容。html

上一章節:sql

WPF柱狀圖(支持數據庫動態更新)

效果圖請加羣查看,在羣共享裏面。數據庫

 

在使用SqlDependency以前須要先開啓sql server的SQL Server Service Broker服務,用來通知數據變化的服務,命令以下:ide

alter database 數據庫名稱 set enable_brokerpost

若是執行成功則執行下列語句,1爲開啓,0未開啓:ui

select IS_BROKER_ENABLED from master.sys.databasesthis

where name='數據庫名稱'url

若是一直在執行的過程當中那就重啓一下sql server服務,如SQL EXPRESS.spa

第一種方式   設計

代碼以下:

private string label11;   //這個至關於一個介質    在用組件的時候有依賴屬性做爲綁定項    就不須要這個  這裏只是一個簡單的demo  因此用這個

        public string Label11
        {
            get { return label11; }
            set { label11 = value; }
        }
    //監聽數據庫的值變化
        void OnDependencyChange(object sender, SqlNotificationEventArgs e)
        {
            GetTable();
        }
        private static string con = "data source=.;initial catalog=ColumnSeriesDB;uid=sa;pwd=sa;";
        string lal;
     //這個若是有依賴屬性就不須要這個    這個是監聽屬性值的變化
        protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
        {
            base.OnPropertyChanged(e);
            if (lal != null)
                if (Label11 != lal)
                    GetTable();
            lal = Label11;
        }


        private void GetTable()
        {
            this.Dispatcher.Invoke(new System.Action(() =>
               {
                   SqlConnection sqlCon = new SqlConnection(con);
                 //須要監控的數據內容
                   SqlCommand cmd = new SqlCommand("SELECT MinData FROM ColumnSeriesData", sqlCon);
                   cmd.CommandType = CommandType.Text;
                   sqlCon.Open();
                   SqlDependency dep = new SqlDependency(cmd);
                  //數據庫的值發生變化時觸發該事件
                   dep.OnChange += new OnChangeEventHandler(OnDependencyChange);
                   SqlDataReader reader = cmd.ExecuteReader();
                   List<string> ls = new List<string>();


                   while (reader.Read())
                   {
                       
                       ls.Add(reader["MinData"].ToString());

                       
                   }
                   Label11 = ls[0].ToString();
                   reader.Close();
                   //wpf  值的綁定
                   Binding ToolTipNameBind = new Binding { Source = this, Path = new PropertyPath("Label11") };
                   BindingOperations.SetBinding(this.label1, Label.ContentProperty, ToolTipNameBind);
            }));
            
        }

        
        private void Window_Loaded_1(object sender, RoutedEventArgs e)
        {
            SqlDependency.Start(con);   //開啓監聽
            GetTable();
            
        }

 

第二種方式   關於在組件開發時的SqlDependency使用代碼以下:

public static DependencyProperty Label11Property = DependencyProperty.Register("Label11", typeof(string), typeof(MainWindow));     //定義一個依賴項屬性    依賴與Label11  二者爲同一個值     第一個參數是要依賴的屬性   第二個爲類型   第三個爲當前的類或窗體名稱

        public string Label11
        {
            get { return (string)GetValue(Label11Property); }
            set { SetValue(Label11Property, value); }
        }
        
        void OnDependencyChange(object sender, SqlNotificationEventArgs e)
        {
            GetTable();
        }
        private static string con = "data source=.;initial catalog=ColumnSeriesDB;uid=sa;pwd=sa;";
         //這裏就不須要這些了     以前是沒有使用依賴屬性  數據庫的數據變化以後   在這裏沒法變化   須要監聽屬性的值   當使用依賴屬性以後   二者的值是依賴關係  綁定以後可自動變化
        //string lal;
        //protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
        //{
        //    base.OnPropertyChanged(e);
        //    if (lal != null)
        //        if (Label11 != lal)
        //            GetTable();
        //    lal = Label11;
        //}


        private void GetTable()
        {
            this.Dispatcher.Invoke(new System.Action(() =>
               {
                   SqlConnection sqlCon = new SqlConnection(con);
                   SqlCommand cmd = new SqlCommand("SELECT MinData FROM ColumnSeriesData", sqlCon);
                   cmd.CommandType = CommandType.Text;
                   sqlCon.Open();
                   SqlDependency dep = new SqlDependency(cmd);
                   dep.OnChange += new OnChangeEventHandler(OnDependencyChange);
                   SqlDataReader reader = cmd.ExecuteReader();
                   List<string> ls = new List<string>();


                   while (reader.Read())
                   {
                       
                       ls.Add(reader["MinData"].ToString());

                       
                   }
                   Label11 = ls[0].ToString();
                   reader.Close();
                   Binding ToolTipNameBind = new Binding { Source = this, Path = new PropertyPath("Label11") };
                   BindingOperations.SetBinding(this.label1, Label.ContentProperty, ToolTipNameBind);
            }));
            
        }

        
        private void Window_Loaded_1(object sender, RoutedEventArgs e)
        {
            SqlDependency.Start(con);
            GetTable();
            
        }

 

關於兩種方式的不一樣 :

第一種方式   好比在鏈接數據庫的時候    如須要遠程鏈接數據庫   在開發組件的時候是不可能將數據庫的名稱、登陸名、密碼等信息寫到組件裏面的,由於這些不是從數據庫中讀取的    就使用不到SqlDependency了 , 因此 在將組件加載到設計器  或者設計平臺的時候  數據庫名稱  數據庫登陸名   密碼等 是不能用依賴屬性直接綁定的  ,就須要這種方式去手動綁定,當修改了數據庫的名稱等信息的時候觸發OnPropertyChanged事件  去從新根據修改的數據庫名稱去登陸數據庫獲取數據。

第二種方式只限於在數據庫中讀取數據。第一種方式比較靈活   能夠本身去作想要的屬性,讓它動態顯示。

 

    在這方面有更好的方案歡迎交流。

 

咱們的羣:94234450

點擊加入QQ羣:

不論你遇到什麼問題,咱們毫不會讓你獨自去面對!

相關文章
相關標籤/搜索