SqlDependency提供了這樣一種能力:當被監測的數據庫中的數據發生變化時,SqlDependency會自動觸發OnChange事件來通知應用程序,從而達到讓系統自動更新數據(或緩存)的目的。
/* * 注意事項: 1.修改Database設置 alter database set enable_broker with rollback immediate; 2.SQL的查詢語法中不能使用 [*] 的方式 [錯誤的:] select * From [dbo].[alarm_table] [正確的] select sn,address,create_time From [dbo].[alarm_table] */ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace SqlDependency_Test { public partial class MainForm : Form { /* 確認DB有執行 [alter database <dbname> set enable_broker with rollback immediate;] */ SqlConnection connection = new SqlConnection(); private static string ConnectionString; public MainForm()//構造 { InitializeComponent(); } /* 啟動SQL監控 */ private void btn_Start_Click(object sender, EventArgs e) { try { ConnectionString = "Data Source=" + txt_dbSource.Text + ";Initial Catalog=" + txt_dbDatabase.Text + ";User ID=" + txt_dbUser.Text + ";Password=" + txt_dbPassword.Text; SqlDependency.Start(ConnectionString);//調用SqlDependency.Start(String strConnectionString)方法,在應用程序端啟用依賴監聽器。 SqlDependencyWatch(); RefreshTable(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } /* 關閉SQL監控 */ private void btn_Stop_Click(object sender, EventArgs e) { SqlDependency.Stop(ConnectionString); } /* 關閉SQL監控 */ private void MainForm_FormClosed(object sender, FormClosedEventArgs e) { SqlDependency.Stop(ConnectionString); } /* 建立SQL監控 */ private void SqlDependencyWatch() { string sSQL = "SELECT [ID],[Name],[Sex],[Birth],[Password],[Insert_Time] FROM [dbo].[T_User]"; using (SqlConnection connection = new SqlConnection(ConnectionString)) { using (SqlCommand command = new SqlCommand(sSQL, connection)) { command.CommandType = CommandType.Text; connection.Open(); SqlDependency dependency = new SqlDependency(command); dependency.OnChange += new OnChangeEventHandler(SQLTableOnChange); SqlDataReader sdr = command.ExecuteReader(); } } } /* 資料表修改觸發Event事件處理 */ void SQLTableOnChange(object sender, SqlNotificationEventArgs e) { SqlDependencyWatch(); RefreshTable(); } /* 重新更新DataGridView顯示資料 */ private void RefreshTable() { string sSQL = "SELECT TOP 100 [ID],[Name],[Sex],[Birth],[Password],[Insert_Time] FROM [dbo].[T_User]"; DataTable datatable = new DataTable(); using (SqlConnection connection = new SqlConnection(ConnectionString)) { connection.Open(); using (SqlCommand cmd = new SqlCommand(sSQL, connection)) { using (SqlDataAdapter dr = new SqlDataAdapter(sSQL, connection)) { dr.Fill(datatable); this.Invoke((EventHandler)(delegate { dgv_Show.DataSource = datatable; })); } } } } } }
在添加完以上代碼運行后會出現“未啟用當前數據庫的 SQL Server Service Broker,因此查詢通知不受支持。如果希望使用通知,請為此數據庫啟用 Service Broker”:
查看數據庫監聽服務是否開啟:
SELECT is_broker_enabled FROM sys.databases WHERE name = 'DB_MyDB';
查詢結果:is_broker_enabled de 結果是 0,代表數據庫沒有啟動 Service Broker
只有數據庫啟用監聽服務,才支持SqlDependency特性。
解決辦法:注:兩句同時執行,單獨執行顯示:正在回滾不合法事務。估計回滾已完成: 100%。
USE DB_MyDB
GO
ALTER DATABASE DB_MyDB SET NEW_BROKER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE DB_MyDB SET ENABLE_BROKER;
再次查詢is_broker_enabled狀態,狀態為1,數據庫沒有啟動 Service Broker成功。