C#-SqlDependencyはデータベーステーブルの変更を監視します

 SqlDependencyはこのような機能を提供します。監視対象のデータベースのデータが変更されると、SqlDependencyは自動的にOnChangeイベントをトリガーしてアプリケーションに通知し、システムがデータ(またはキャッシュ)を自動的に更新できるようにします。

 

/ *
 *注意が必要な事項:

1.データベース設定を変更します
データベースセットのenable_brokerをロールバック即時に変更します。

2. [*]メソッドはSQLのクエリ構文では使用できません
[間違った:] select * From [dbo]。[Alarm_table]

[正确的] select sn、address、create_time From [dbo]。[alarm_table]
 * /

システムの使用;
System.Collections.Generic; を使用します。
System.ComponentModel を使用します。
System.Data を使用します。
System.Data.SqlClient を使用します。
System.Drawing を使用します。
System.Linq を使用します。
System.Text を使用します。
System.Threading.Tasks を使用します。
System.Windows.Forms を使用します。

名前空間SqlDependency_Test
{
    パブリック 部分 クラスMainForm:フォーム
    {
        / * 确认DB有执行[alter database <dbname> set enable_broker with rollback immediate;] * / 
        SqlConnection connection = new SqlConnection();
        プライベート 静的 文字列ConnectionString;

        public MainForm()// 構築
        {
            InitializeComponent();
        }

        / * SQL監視を開始します* / 
        private  void btn_Start_Click(object sender、EventArgs e)
        {
            試す
            {
                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();
            }
            キャッチ(例外例)
            {
                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] " ;

            使用して(SqlConnectionオブジェクトの接続= 新しいSqlConnectionオブジェクト(のConnectionString))
            {
                using(SqlCommand command = new SqlCommand(sSQL、connection))
                {
                    command.CommandType = CommandType.Text;
                    connection.Open();
                    SqlDependency依存関係 = 新しいSqlDependency(コマンド);
                    dependency.OnChange + = new OnChangeEventHandler(SQLTableOnChange);
                    SqlDataReader sdr = command.ExecuteReader();
                }
            }
        }

        / * データテーブルの変更がイベントイベント処理をトリガー* / 
        void SQLTableOnChange(オブジェクト送信者、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();
            使用して(SqlConnectionオブジェクトの接続= 新しいSqlConnectionオブジェクト(のConnectionString))
            {
                connection.Open();
                使用(SqlCommand cmd = new SqlCommand(sSQL、connection))
                {
                    使用(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機能は、データベースでリスニングサービスが有効になっている場合にのみサポートされます

 

解決策:注:2つの文は同時に実行され、個別の実行は、不正なトランザクションがロールバックされていることを示しています。推定ロールバック完了:100%。

DB_MyDBを使用  
行く
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

おすすめ

転載: www.cnblogs.com/mexihq/p/12697797.html