C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 124 を表示中)
■73958 / )  Re[3]: SqlDataAdapterのUpdateコマンドエラー?
□投稿者/ 魔界の仮面弁士 (172回)-(2014/11/17(Mon) 18:53:26)
No73956 (しろくま5 さん) に返信
> dim ds as new DataSet
> adp.fill(ds)
> dim dt as DataTable = ds.tables(0)
> connect.close()

これだけでは不十分だったりします。

No73956 にて、DataRow の RowState プロパティについて触れていますが、
このプロパティのことはご存知でしょうか?

---------
SelectCommand で取得したばかりの未加工のデータは、
DataRow の RowState プロパティが「Unchanged」の状態です。

そしてその行を編集すると、RowState が「Modified」へと変化します。
編集前の値と編集後の値を取り出すことも出来ます。

 Dim row As DataRow = ds.tables(0).Rows(0)
 oldValue = row("列名", DataRowVersion.Original)
 newValue = row("列名", DataRowVersion.Current)


そして、「削除」した場合は DataTable.Rows から取り除かれるのではなく、
「Deleted」状態となります。いわゆる削除フラグが立てられた状態です。
このモードの時は、
 oldValue = row("列名", DataRowVersion.Original) '削除する前の値
 'newValue = row("列名", DataRowVersion.Current) '削除済みの行なのでエラー!
という動作になります。


そして追加した行については、「Added」状態です。
.Rows.Add で追加した場合などがこの状態ですね。
---------

Update メソッドに DataTable を引き渡した場合、
各行の RowState プロパティが参照され、各コマンドに引き渡されます。

 "Modified" な行は UpdateCommand 経由で UPDATE の SQL へ
 "Deleted" な行は DeleteCommand 経由で DELETE の SQL へ
 "Added" な行は InsertCommand 経由で INSERT INTO の SQL へ

という感じです。Unchanged な行は編集の必要が無いので無視されます。


今回の場合、
 adp.fill(ds)
 dim dt as DataTable = ds.tables(0)
は、全ての行が Unchanged なので無視され、
 table.Rows.Add(row)
は、Added がマークされているため、登録されたわけです。
-----------

なお、Update メソッドを呼び出した後も、RowState を変更せずにおくと、
再度 Update したときに、二重に INSERT されてしまうなどの問題を引き起こします。

そのため、Update 後には AcceptChanges メソッドを呼び出して、
RowState を最新の値に戻すようにします。

AcceptChanges を呼び出した場合、"Modified" や "Added" な行は、
「新しい値」を使って "Unchanged" 状態へと遷移します。
"Deleted" な行は、DataTable.Rows から取り除かれ、"Detached" となります。

AcceptChanges は、いわば擬似的なコミット操作ですね。

一方、ロールバックに相当する操作は RejectChanges メソッドです。こちらは、
"Added" な行を未登録状態、すなわち DataTable.Rows から取り除いて "Detached" とします。
"Modified" な行は「編集前の値」を使って "Unchanged" 状態へと戻し、
"Deleted" な行は、削除フラグを取り消して "Unchagend" 状態とします。
返信 編集キー/


管理者用

- Child Tree -