- - PR -
DataTable.AcceptChanges()の戻り値がnull
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-05-16 21:55
おそらく大きく勘違いしていると思うのですが
DataTable.GetChanges()の戻り値がnullになってしまいます。 以下がコードです。 DbDataAdapter da = new SqlDataAdapter(sqlStr, connStr); DataSet ds = new DataSet(); da.Fill(ds, "work"); DataTable table = ds.Tables[0]; // この時点で2レコードあります。 table.AcceptChanges(); table.Merge(table2); // table2をマージして3レコードになります。 table = table.GetChanges(); // ここで、AcceptChanges()後の違いが取得したいがnullが返る。 あるいは、AcceptChanges()後に ブレークポイントをかけて、データベースを更新し、 GetChanges()を呼んでもやっぱりnull。 そもそも使い方、考え方が違うのでしょうか? 環境はVisualStudio2005です。 | ||||||||
|
投稿日時: 2006-05-16 22:14
GetChanges の解説はこうなってますよ。
ついでに AcceptChanges の解説も。
| ||||||||
|
投稿日時: 2006-05-16 23:57
すいません。いろいろ試していたので、最終的に変なことになってますね。
table.Merge(table2);じゃ、 これって、DataTableのインスタンスが変更されただけかな? table.Merge(table2)の代わりに SqlDataReaderとSqlCommandを使って、update文を実行っていうのを はさんでも結果は同じでした。 解説どおりだと、これでもGetChanges()の結果が取れそうなものかな? と思うのですが。 (大きく勘違いしている予感です) | ||||||||
|
投稿日時: 2006-05-17 10:10
AcceptChanges()の後に以下で更新したら、GetChanges()の戻り値ちゃんと
返ってきました。 table.PrimaryKey = new DataColumn[] { table.Columns["xxx"] }; DataRow targetRow; targetRow = table.Rows.Find("yyy"); targetRow["ZZZ"] = "zzz"; | ||||||||
|
投稿日時: 2006-05-17 11:56
こんにちは。
とりあえずテスト用コードを作って調べてみました。
この結果を見る限りでは、Mergeしたあとは dt の RowState は全て Unchanged になっています。ということは GetChanges() で null が返ってくるのは正しい処理なの ではないでしょうか。 頭脳パンさんのやりたいことは(文章から察するに) dt に追加された dt2 の3行分が Added で返ってくるのでは?ということだと思うのですが、これは上記のようなコードを書 いて試せばすぐわかりそうな気がしますよ。 # テストデータについてのクレームは受け付けません | ||||||||
|
投稿日時: 2006-05-17 12:40
検証コードありがとうございます。
むしろ、そういうデータの挿入ってできるんですね。 SQLからだけだと思ってました。 Addでは、Unchangedということは修正とはみなされないってことですかね。 | ||||||||
|
投稿日時: 2006-05-17 12:51
違います。 Add した行の RowState は Added です。 その後、AcceptChanges を呼び出すことで RowState が Unchanged に変化します。 AcceptChanges する前に GetChanges を呼び出せば Add した行が返ってきます。 ついでに、Fill を呼び出してテーブルに作られた行も、本来は Added になります。しかし、DataAdapter.AcceptChangesDuringFill プロパティがデフォルトで true の為、内部で自動的に AcceptChanges が呼び出されて各行の RowState が Unchanged になります。 Merge は RowState が変化するわけではないんですよね(行の情報は変わっていないので。所属するテーブルの変更というのも行の情報が変化と考えることもできるんですが)。 | ||||||||
|
投稿日時: 2006-05-17 13:12
この手の話題はあまり詳しくないので、登場したくなかったんですが、何かに導か
れるように「返信」ボタンをクリックしてしまいましたw
DataSet の立場になって考えて見ると理解しやすいと思いますよ。 アダプターからセットされたデータの塊に対して行われた何らかの処理を、効率よく、 且つ他のタスクや他のユーザーとの変更の優先順序などからおかしな状態にならない よう更新するためには、対象のレコードが「変更」された場合と「追加」された場合 では明らかに行う処理が異なります。 なので、ステータスが同じじゃまずい訳です。 #最近 DataSet は勉強したばっかり(^▽^;) [ メッセージ編集済み 編集者: R・田中一郎 編集日時 2006-05-17 13:17 ] |