データベースを使用するプログラムで、特定のデータが更新された際に何か処理を行うという場合があります。
真っ先に思いつく方法としては、「ポーリング」つまり定期的にデータベースからデータを取得して変更の確認し、もしもデータの内容に変更があれば必要な処理を行うという方法です。
しかし、ポーリング間隔を短くするとトラフィックや負荷が増えてしまい、逆にポーリング間隔を長くすれば、データ変更から実際に処理が行われるまでの遅延が大きくなってしまいます。
そこで、使用できる環境が限定されてしまいますが、Microsoft SQL Server 2005 以降のデータベースを使用している場合クエリ通知を検討してみると良いかもしれません。
使い方は簡単で、
using System.Data.SqlClient;
private SqlDependency sqlDependency; /// <summary> /// クエリ通知サンプル /// </summary> private void button1_Click(object sender, EventArgs e) { // 接続文字列 string connectionString = "Data Source=127.0.0.7;Initial Catalog=TestDatabase;Integrated Security=True;"; // クエリ通知の開始(一度だけ開始すれば良い) SqlDependency.Start(connectionString); using (SqlConnection sqlConnection = new SqlConnection(connectionString)) using (SqlCommand sqlCommand = sqlConnection.CreateCommand()) { sqlConnection.Open(); sqlCommand.CommandText = "SELECT Student.Name, Student.Sex, Student. FROM dbo.Student"; // クエリ通知イベントを登録する this.sqlDependency = new SqlDependency(sqlCommand); this.sqlDependency.OnChange += OnChange; // クエリの結果が必要であれば sqlCommand.ExecuteReader() などを使用する sqlCommand.ExecuteNonQuery(); } } /// <summary> /// クエリ通知イベント /// </summary> private void OnChange(object sender, EventArgs e) { System.Diagnostics.Debug.WriteLine("OnChange"); // SqlDependency からのイベントは一度しか発生しないのでイベントを削除 this.sqlDependency.OnChange -= OnChange; }
いくつか注意点があり、
など、少し使い勝手に難はありますが、使いこなすことが出来るとかなり便利な機能です。
詳しくはMSDNのSQL Server のクエリ通知 (ADO.NET)を確認して下さい。