|
■No92306 (ぽんた さん) に返信 > なぜAcceptChangesメソッドを使う必要があるのでしょうか? > DataRow.RowStateプロパティのAdded行というのが関係しているのかと思うのですが、 > そのあたりが、よく理解できていないので、合わせて説明していただきたいです。
RowState プロパティは、下記の 5 つの状態を意味します。 Detached … DataTable に割り当てられていない行 Unchanged … 更新されていない行 Added … 新規追加された行 Delted … 削除された行 Modified … 更新された行
これにより、データベースに書き戻す必要があるかどうか、そして 書き戻す場合に InsertCommand/DeleteCommand/UpdateCommand のいずれの クエリーを呼び出すかが判定されます。
また、AcceptChanges メソッドを呼び出すと、これらの状態が確定されて、 各行が以下のように変化します。 Detached → Detached (影響を受けない) Unchanged → Unchanged (影響を受けない) Added → Unchanged (追加行が確定され、未編集行になる)※Originalが消え、Current のみになる Delted → Detached (削除処理が確定され、DataTable.Rows から取り除かれる) Modified → Unchanged (編集行が確定され、未編集行になる)※Current の内容が Original の値で置き換えられる
一方、RejectChanges() メソッドの場合には、編集前の状態に戻されれます。 Detached → Detached (影響を受けない) Unchanged → Unchanged (影響を受けない) Added → Detached (追加処理がキャンセルされ、DataTable.Rows に未割当の状態に戻る) Delted → Unchanged (削除処理がキャンセルされ、未編集行に戻る) Modified → Unchanged (編集行がキャンセルされ、未編集行に戻る)※Originalが消え、Current のみになる
Sub Main() Dim ds As New DataSet() Dim tbl As DataTable = ds.Tables.Add("TBL") tbl.Columns.Add("COL1")
'3 行のデータを登録して AcceptChanges しておく Dim row0 As DataRow = tbl.Rows.Add("0行目") Dim row1 As DataRow = tbl.Rows.Add("1行目") Dim row2 As DataRow = tbl.Rows.Add("2行目") ds.AcceptChanges()
'0行目は削除 '1行目は編集 '2行目は何もしない '3行目に新規行 row0.Delete() row1("COL1") = "編集" Dim row3 As DataRow = tbl.Rows.Add("3行目")
'未割当の行 Dim newRow As DataRow = tbl.NewRow() newRow("COL1") = "初期値"
Console.WriteLine("=== RowState ===") For r = 0 To tbl.Rows.Count - 1 Console.WriteLine("{0}行目の RowState = {1}", r, tbl.Rows(r).RowState) Next Console.WriteLine("未割当行の RowState = {0}", newRow.RowState)
Console.WriteLine("=== DataRowVersion ===") Console.WriteLine("0行目の削除前の値=`{0}`", tbl.Rows(0)("COL1", DataRowVersion.Original)) Console.WriteLine("1行目の編集前の値=`{0}`", tbl.Rows(1)("COL1", DataRowVersion.Original)) Console.WriteLine("1行目の今現在の値=`{0}`", tbl.Rows(1)("COL1", DataRowVersion.Current)) Console.WriteLine("2行目の編集前の値=`{0}`", tbl.Rows(2)("COL1", DataRowVersion.Original)) Console.WriteLine("2行目の今現在の値=`{0}`", tbl.Rows(2)("COL1", DataRowVersion.Current)) Console.WriteLine("3行目の今現在の値=`{0}`", tbl.Rows(3)("COL1", DataRowVersion.Current)) Console.WriteLine("未割当行の 現在値=`{0}`", newRow("COL1", DataRowVersion.Proposed))
Console.WriteLine("=== AcceptChanges 後の RowState ===") ds.AcceptChanges() For r = 0 To tbl.Rows.Count - 1 Console.WriteLine("現{0}行目の RowState = {1}", r, tbl.Rows(r).RowState) Next Console.WriteLine("-----") Console.WriteLine("旧0行目の RowState = {0}", row0.RowState) Console.WriteLine("旧1行目の RowState = {0}", row1.RowState) Console.WriteLine("旧2行目の RowState = {0}", row2.RowState) Console.WriteLine("旧3行目の RowState = {0}", row3.RowState)
Console.ReadLine() End Sub
|