1

データベースの変更を待機する Windows サービスがあります。

それが見るデータベーステーブルは次のようになります:

ID [ガイド]

名前 [テキスト]

MatchId [Guid] => これは外部キーです

MatchDateTime [日時]

誰かが「MatchId」フィールドを「クリア」した (NULL が割り当てられた) たびにサービスが検出するようにしたいのですが、

次に、「MatchId」フィールドに「NULL」が含まれるすべての行に対して、それらの一致を見つけて「MatchId」フィールドを割り当てるアルゴリズムを実行します。

問題は、「SqlDependency」クラスを使用し、それが「MatchId」フィールドでトリガーされるのを待つ場合、新しい行が影響を受ける場合にのみ通知されますが、「MatchId = NULL」の既存の行は通知されません。について知る。

これは、Windows サービスがロードされ、テーブルに「MatchId = NULL」の行が既に 20 行あり、次の 5 時間は誰も「MatchId」行を「クリア」しない場合、つまり、私にはわからないことを意味します。既存の 20 行についてであり、それらを処理しません。

1 つの解決策は、「SqlDependency」をセットアップする前に、「MatchId = NULL」の既存の行があるかどうかを確認するために簡単な「選択」を実行し、存在する場合はそれらを処理してから、依存関係をセットアップすることです。

問題は、これらの行の処理が終了してから SqlDependency を設定するまでの短い間隔で、誰かが行を 'MatchId = NULL' に変更したというイベントが発生する可能性があることです。 Sql依存関係。

これをどのように解決できるか考えていますか?

(最悪の場合は、SqlDependency を使用せず、XXX 分ごとにデータベースをポーリングする必要があります ...)

4

1 に答える 1

1

私はこの答えに遅れていることを理解していますが、あなたが選択したアプローチを更新していません:)

最初に SQLDependency を開始してから、選択クエリを実行して既存のレコードを確認できます。つまり、SQLDependency が開始された後 (最初または変更後) に毎回 null レコードをポーリングします。

どの SQLDependency によってトリガーされた変更関数をどのように把握するかという質問への回答でも、同じアプローチが提案されています。

何よりもまず、コマンドを実行する前にハンドラを設定する必要があります。そうしないと、通知が失われ、コールバックが呼び出されない可能性があるウィンドウが表示されます

.

于 2012-09-26T16:31:24.703 に答える