0

データベースで発生する更新をリッスンするために、ある種のポーリングを実行しようとしています。これまで、データベース(またはカップルテーブル)のMD5ハッシュ(または任意のタイプまたはハッシュ)を取得し、それを変数に格納し、このプロシージャを繰り返しループするスレッドを実行して、最後の結果と比較することを検討していました。別のボタンがある場合は、データベースのロード機能をトリガーするボタンが[有効]に設定されます。

それはそれを行うための良い方法ですか?そうでない場合、なぜですか?はいの場合、どのように?

私が達成する方法が本当にわからないのは、データベースの側でMD5ハッシュを取得することです。すべてのデータを簡単に取得してから、すべてのクライアント側でそのmd5ハッシュを取得できましたが...そうです。

LINQ to SQLを使用していますが、コンテキストを使用してRawクエリを実行することしかできないのではないかと心配しています。これはWinForms、.NET 3.5にあります(ただし、重要ではありません...)。

ヒントは大歓迎です。ありがとう!

4

2 に答える 2

6

車輪の再発明をしないでください。仕事に適したツールを使用します。

  • 変更の追跡SQLServer2008の変更の追跡により、アプリケーションは、ユーザーテーブルに加えられた変更と、それらの変更に関する情報のみを取得できます。

  • 変更データキャプチャ変更データキャプチャは、SQL Serverテーブルに適用された挿入、更新、および削除アクティビティをキャプチャし、変更の詳細を簡単に使用できるリレーショナル形式で利用できるようにするように設計されています。変更データキャプチャで使用される変更テーブルには、追跡されたソーステーブルの列構造を反映する列と、発生した変更を理解するために必要なメタデータが含まれています。

上記の両方のテクノロジーは、時々接続されるシステムを対象としていることに注意してください(たとえば、ローカルスナップショットを更新するためにロッドに接続するモバイルユーザー)。永続的に接続されており、バックエンドで変更が発生したときに表示を更新する必要があるシステムの場合、適切なテクノロジーはクエリ通知です。

于 2012-08-16T12:25:07.480 に答える
1

すべてのデータをポーリングしてデータベースへの変更を検出することは、考えられる最悪のアイデアです。実際の変更を行うクライアントを制御できない場合、AFAIKはこれを行うための正しい方法はありません(アプリがこのレベルの情報を必要とする場合は、全員が協力する必要があります)。

それでも恐ろしい回避策として、rowversion最大値を選択してローカルにキャッシュされた「古い最大値」と比較することにより、すべてのテーブルに列を追加し、テーブルのポーリングごとに列を追加できます。行が更新されるたびにその行がrowversion変更されるため、何かが更新されたことを知るだけでなく、必要に応じてテーブルから更新されたレコードだけを選択することもできます。

于 2012-08-16T12:25:54.280 に答える