2012-01-24 11 views
4

私は、SQL依存関係(C#4.0)を使用してデータベースの変更をリッスンする方法を理解しようとしています。私はWeb上でかなり多くのことを見てきましたが、SQL Dependencyが依存しているのと同じデータを取得する依存関係を使用するために(自然に)調整されているようです。たとえば、this articleです。C#のSQL依存関係

私がしようとしているのは、トリガされたときに、他の方法などで保存できるさまざまなSQLの「選択」クエリの結果となる依存関係を作成することです。例:テーブルの行数を監視する依存関係を設定しようとしています。行数が増えたら、x、y、zを実行します(つまり、プログラムは行数が気にならず、行数が増えていても大丈夫です)。

これを行う最も良い方法は何ですか?

編集:私は現在自分のコードを添付しています。私はGetData()プロセスからSqlDependencyの設定を分離する方法を理解しようとしています。現在、しかし、私は、イベントハンドラと再実行「SetupSqlDependencyを()」を削除した後、それはすぐに戻ってあなたがSqlDependencyをフックすることができますイベントハンドラ

private void SetupSQLDependency() 
    { 
     // Tutorial for this found at: 
     // http://www.dreamincode.net/forums/topic/156991-using-sqldependency-to-monitor-sql-database-changes/ 

     SqlDependency.Stop(connectionString); 
     SqlDependency.Start(connectionString); 

     sqlCmd.Notification = null; 

     // create new dependency for SqlCommand 
     SqlDependency sqlDep = new SqlDependency(sqlCmd); 
     sqlDep.OnChange += new OnChangeEventHandler(sqlDep_OnChange); 

     SqlDataReader reader = sqlCmd.ExecuteReader(); 
    } 
private void sqlDep_OnChange(object sender, SqlNotificationEventArgs e) 
    { 
     // FROM: http://msdn.microsoft.com/en-us/a52dhwx7.aspx 

     #region 
     // This event will occur on a thread pool thread. 
     // Updating the UI from a worker thread is not permitted. 
     // The following code checks to see if it is safe to 
     // update the UI. 

     /* ISynchronizeInvoke i = (ISynchronizeInvoke)this; 

     // If InvokeRequired returns True, the code 
     // is executing on a worker thread. 
     if (i.InvokeRequired) 
     { 
      // Create a delegate to perform the thread switch. 
      OnChangeEventHandler tempDelegate = new OnChangeEventHandler(sqlDep_OnChange); 

      object[] args = { sender, e }; 

      // Marshal the data from the worker thread 
      // to the UI thread. 
      i.BeginInvoke(tempDelegate, args); 

      return; 
     }*/ 
     #endregion 

     // Have to remove this as it only work's once 
     SqlDependency sqlDep = sender as SqlDependency; 
     sqlDep.OnChange -= sqlDep_OnChange; 

     // At this point, the code is executing on the 
     // UI thread, so it is safe to update the UI.. 

     // 1) Resetup Dependecy 
     SetupSQLDependency(); 

    } 

答えて

5

に行くように、私は無限ループのビットに入ると思います。イベントを変更し、このイベントハンドラで好きなことをします。これは、実際には、あなたがしたいことをする唯一の方法であり、何も問題はありません。

は擬似コードでは、次のようになります。

var dep = new SqlDependency(GetSqlQueryForMonitoring()); 
dep.Change +=() => { 
var data = ExecSql(GetDataQuerySql()); 
UpdateCache(data); 
}; 

非常にシンプル。ただ2つの異なるクエリを使用してください。

編集:サンプルコードには、UIスレッドで実行されているというコメントがあります。なぜそれは事実であるべきですか?疑わしい。いずれにしても、依存関係をリセットする前にクエリを実行する必要があります。そうしないと、並行して無効化が行われる可能性があります。

データベースから新しいデータを取得し、それを更新するためにuiにメッセージを送信することをお勧めします(呼び出し)。

+0

私が混乱しているのは、依存関係を "GetData"マテリアルに設定するプロセスを組み合わせていることです。私はそれを分離する方法を見つけようとしています、もしあなたの要点を詳述するために編集されたのであれば – keynesiancross

+0

です。 – usr

+1

ありがとうございます。どこで.Changeイベントを取得しますか?私はOnChangeイベントだけを取得しますか? (または私は言語を越えて管理することができました...)。私は私の現在のコードを含めるように私の質問を更新しました – keynesiancross