SqlDependency C#代碼監聽數據庫表的變化


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);//傳入連接字符串,啟動基於數據庫的監聽
        }
View Code

在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();
            }
        }
View Code

不要忘記配置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>
View Code

在添加完以上代碼運行后會出現“未啟用當前數據庫的 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');窗口就立馬監測到了數據庫表的變化了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM