- PR -

DataSet内のテーブル比較について

投稿者投稿内容
yang
会議室デビュー日: 2004/12/18
投稿数: 8
投稿日時: 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


なにか状態が違うものだけを更新されたようにできる
マージの方法があるのでしょうか?
不勉強で申し訳ないですが、ご教授していただけると助かります。
yang
会議室デビュー日: 2004/12/18
投稿数: 8
投稿日時: 2004-12-21 18:07
前文の修正ですが、更新状態ですが、
Addedではなく、Modifiedですね。間違えました。
また、サンプルの例では、
ds.AcceptChanges();
が抜けています。
yang
会議室デビュー日: 2004/12/18
投稿数: 8
投稿日時: 2004-12-21 18:18
ひょっとすると、
プライマリーキーの設定にdt.Columns["status"]まで、
つければよいということでしょうか?
だとすれば、テーブルのレコードは増えますが、
Addedだけを抽出すればいいわけですね。
(書き換わらなかったものは、Unchangedとなる)
少々、トリッキーのような気がしますが、
確かに目的は達せられれます。

どの方法がいいのか悩ましいところです。
Os_
ベテラン
会議室デビュー日: 2003/04/16
投稿数: 77
投稿日時: 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になっているのであれば、そのままマージされます。

スキルアップ/キャリアアップ(JOB@IT)