上一章節咱們講到wpf的柱狀圖組件,它包含了非輪詢方式更新數據庫變化SqlDependency的內容,可是沒有詳細解釋,如今給你們一個比較簡單的例子來講明這部份內容。html
上一章節:sql
效果圖請加羣查看,在羣共享裏面。數據庫
在使用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
不論你遇到什麼問題,咱們毫不會讓你獨自去面對!