3

DataSet をデータベース内のデータと同期するための最良の方法は何ですか? パラメータは次のとおりです。

  • データはユーザーが構成した可能性のある UI コントロールにバインドされているため、単純にデータを再読み込みすることはできません (展開/折りたたみが可能なツリー グリッドです)。
  • データベースで変更フラグ (UpdatedTimeStamp など) を使用することはできません。これは、変更が常にアプリケーションを通過するとは限らないためです (たとえば、DBA は SQL ステートメントでフィールドを更新できます)。
  • マルチユーザー システムであるため、データベースで更新トリガーを使用できません。
  • ADO.NET DataSet を使用しています
  • 特定の行の複数のフィールドを変更できます

DataSet の Merge 機能を見てきましたが、これは「ID」列の概念を保持していないようです。私は DiffGram 機能を見てきましたが、ここでの問題は、外部データ ソースで発生した変更ではなく、同じ DataSet 内の変更から生成されたように見えることです。

私はしばらくの間このソリューションから実行してきましたが、私が知っているアプローチは (多くの非効率性で) 機能することを知っています。それは、別の DataSet を構築し、フィールドごとに変更を適用するすべての行を、それが存在する DataSet に適用することです。バウンド。

誰かが同様のシナリオを持っていましたか? 問題を解決するために何をしましたか。同様の問題に遭遇していない場合でも、解決策の推奨事項は大歓迎です。

ありがとう

4

2 に答える 2

1

DataSet.Mergeは、各 DataTable に主キーが定義されている場合にうまく機能します。DataSet は変更されたイベントをデータバインドされた GUI コントロールに発生させます。

テーブルが小さい場合は、すべての行を再読み取りして定期的にマージすることができます。それ以外の場合は、セットをタイムスタンプで読み取るように制限することをお勧めします-DBAにルールに従ってタイムスタンプを更新するように指示してください;-)

別のオプション (少し手間がかかります) は、トリガーまたはストアド プロシージャを使用して変更された行のキュー (タイムスタンプ、行 ID) を保持し、キュー内のタイムスタンプに基づいて更新クエリを実行することです。これは、ベース テーブルに多くの行が含まれている場合に効率的であり、(キュー レコードの内部結合を介して) 最後のポーリング時間以降に変更された行のみを取得できます。

于 2008-10-01T18:08:35.033 に答える
0

ユーザーが展開したノードのリストを保存し (それぞれを一意に識別できると仮定)、データを再ロードしてツリー ビューに再バインドし、すべてのノードを展開する方が簡単だと思います。以前に拡張しました。

于 2008-10-01T17:00:20.203 に答える