SqlDependency提供了這樣一種能力:當被監測的數據庫中的數據發生變化時,SqlDependency會自動觸發OnChange事件來通知應用程序,從而達到讓系統自動更新數據(或緩存)的目的。
場景:當數據庫中的數據發生變化時,需要更新緩存,或者需要更新與之相關的業務數據,又或者是發送郵件或者短信什么的等等情況時(我項目中是發送數據到另一個系統接口),如果數據庫是SQL Server,可以考慮使用SqlDependency監控數據庫中的某個表的數據變化,並出發相應的事件。
學習時建的控制台應用程序“SqlDependency_監聽數據庫”
函數入口Main函數中添加以下代碼:

private static string _connStr; static void Main(string[] args) { _connStr = ConfigurationManager.ConnectionStrings["ConnectionStringMain"].ToString(); SqlDependency.Start(_connStr);//傳入連接字符串,啟動基於數據庫的監聽 UpdateGrid(); Console.Read(); SqlDependency.Stop(_connStr);//傳入連接字符串,啟動基於數據庫的監聽 }
在Main函數的下面緊接着再寫一下兩個方法:

private static void UpdateGrid() { using (SqlConnection connection = new SqlConnection(_connStr)) { connection.Open(); //依賴是基於某一張表的,而且查詢語句只能是簡單查詢語句,不能帶top或*,同時必須指定所有者,即類似[dbo].[] using (SqlCommand command = new SqlCommand("SELECT [Process_Cmn_AssyAcc],[Process_Cmn_Snum] FROM [dbo].[T_DD_OP101_Final]", connection)) { command.CommandType = CommandType.Text; //connection.Open(); SqlDependency dependency = new SqlDependency(command); dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); using (SqlDataReader sdr = command.ExecuteReader()) { Console.WriteLine(); while (sdr.Read()) { Console.WriteLine("AssyAcc:{0}\tSnum:{1}\t", sdr["Process_Cmn_AssyAcc"].ToString(), sdr["Process_Cmn_Snum"].ToString()); } sdr.Close(); } } } } private static void dependency_OnChange(object sender, SqlNotificationEventArgs e) { if (e.Type == SqlNotificationType.Change) //只有數據發生變化時,才重新獲取並數據 { UpdateGrid(); } }
不要忘記配置App.config連接字符串(需要添加引用System.Configuration;該程序集不是新建控制台程序時默認添加的)

<connectionStrings> <add name="ConnectionStringMain" connectionString="Data Source=192.168.1.211;Initial Catalog=WLZhuJianMes;Persist Security Info=True;User ID=sa;Password=sa;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> </connectionStrings>
在添加完以上代碼運行后會出現“未啟用當前數據庫的 SQL Server Service Broker,因此查詢通知不受支持。如果希望使用通知,請為此數據庫啟用 Service Broker”:
在數據中執行以下查詢:
SELECT is_broker_enabled FROM sys.databases WHERE name = 'WLZhuJianMes'
查詢結果:is_broker_enabled de 結果是 0,代表數據庫沒有啟動 Service Broker
解決辦法:注:兩句同時執行,單獨執行顯示:正在回滾不合法事務。估計回滾已完成: 100%。
use WLZhuJianMes go ALTER DATABASE WLZhuJianMes SET NEW_BROKER WITH ROLLBACK IMMEDIATE; ALTER DATABASE WLZhuJianMes SET ENABLE_BROKER;
再次查詢is_broker_enabled狀態,狀態為1,數據庫沒有啟動 Service Broker成功。
啟動項目后的顯示頁面:
向數據庫的表中添加一條數據:insert into [WLZhuJianMes].[dbo].[T_DD_OP101]([Process_Cmn_AssyAcc],[Process_Cmn_Snum]) values(1,'342536465456');窗口就立馬監測到了數據庫表的變化了。