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を正常に開始しませんでした。