- - PR -
DataSet内のテーブル比較について
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2004-12-21 17:43
ぢゃん♪さん
返信ありがとうございます。 >ここがよく分からないんですが。 >新旧比較と差分取り出し(yangさんのFind文実行はこれでしょう)をやってくれるのが >GetChagesメソッド、テーブルCopyをやってくれるのがMergeメソッドなのに……。 >なぜFind文の実行が必要ですか? 私の不勉強で申し訳ないですが、Mergeメソッドでうまく差分がとれるのでしょうか? やり方として、 一意のレコードを結ぶために、code,word,bitにプライマリーキーを設定し dt.PrimaryKey = new DataColumn[]{dt.Columns["code"], dt.Columns["word"], dt.Columns["bit"]}; そして、Mergeメソッドを発行することになるかと思います。 ds.Merge(Notify_ds); // ds:旧DataSet Notify_ds:新しいDataSet その結果、すべてのレコードがAdded状態になるように思うのですが、 --- ワードビット一覧 --- WordBits:WordBits code:30 word:1 bit:0 status:1 state:Added code:30 word:1 bit:1 status:0 state:Added code:30 word:1 bit:2 status:0 state:Added code:30 word:1 bit:3 status:1 state:Added code:30 word:2 bit:0 status:0 state:Added code:30 word:2 bit:1 status:0 state:Added code:30 word:2 bit:2 status:0 state:Added code:30 word:2 bit:3 status:0 state:Added なにか状態が違うものだけを更新されたようにできる マージの方法があるのでしょうか? 不勉強で申し訳ないですが、ご教授していただけると助かります。 |
|
投稿日時: 2004-12-21 18:07
前文の修正ですが、更新状態ですが、
Addedではなく、Modifiedですね。間違えました。 また、サンプルの例では、 ds.AcceptChanges(); が抜けています。 |
|
投稿日時: 2004-12-21 18:18
ひょっとすると、
プライマリーキーの設定にdt.Columns["status"]まで、 つければよいということでしょうか? だとすれば、テーブルのレコードは増えますが、 Addedだけを抽出すればいいわけですね。 (書き換わらなかったものは、Unchangedとなる) 少々、トリッキーのような気がしますが、 確かに目的は達せられれます。 どの方法がいいのか悩ましいところです。 |
|
投稿日時: 2004-12-21 19:07
Osです。
離れている間に、Findが誤解されているようで、レスします。 最初に書きましたが、1つのDataTableで処理する場合を想定しています。 情報を収集しながらデータを更新するには1つで可能ではないかなと考えています。 また、質問の内容から、下の2のパターンが考えられFindメソッド使用を提案しています。 想定した手順は [初期状態]を設定します。 yangさんの例ですと data.Create(ds, "WordBits"); // テーブルを作成 になるかと思います。 この後、全てのレコードが追加状態になっているので、 ds.Tables["WordBits"].AcceptChanges(); を実行します。 [情報収集] どの様な手順か不明ですが、大きく2つの方法が考えられます。 1. DataTable上のレコード順にcode,word,bitの値毎に収集する この場合、Findメソッドは必要なく、収集したstatusの差異がある場合のみ更新する 2.ランダムに収集した情報からcode,word,bitをキーとして DataTableのDataRowをFindメソッドで検索して 収集したstatusの差異がある場合のみ更新する 情報の更新だけ考えると1の方が効率がいいのは当然です。 全ての情報収集が終了した時点で、 DataTable.GetChanges()メソッドで更新情報を抽出します。 次回の情報収集に備えて、 DataTable.AcceptChanges();メソッドを実行します。 ちなみに ぢゃん♪さん が提案されている2つのDataTableを使う場合の Mergeメソッドの使用は、statusが変わらないレコードが 新しいDataTableに存在する場合の対応が必要になるのでは? yangさんが質問されている内容で、 新しいDataTableでstatusが変わらないレコードのRowStateはどのようになっていますか? Modifiedになっているのであれば、そのままマージされます。 |