C#--SqlDependency監控數據庫表的變化


 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成功。

 

 

參考:https://www.haolizi.net/example/view_16216.html


免責聲明!

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



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