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

わんくま同盟

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

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

■92314 / 1階層)  DBのレコード追加
□投稿者/ 魔界の仮面弁士 (2368回)-(2019/09/10(Tue) 15:57:17)
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
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←DBのレコード追加 /ぽんた →Re[2]: DBのレコード追加 /ぽんた
 
上記関連ツリー

DBのレコード追加 / ぽんた (19/09/10(Tue) 14:57) #92306
DBのレコード追加 / 魔界の仮面弁士 (19/09/10(Tue) 15:57) #92314 ←Now
│└ Re[2]: DBのレコード追加 / ぽんた (19/09/10(Tue) 16:06) #92315
│  └ Re[3]: DBのレコード追加 / 魔界の仮面弁士 (19/09/10(Tue) 16:12) #92317
Re[1]: DBのレコード追加 / WebSurfer (19/09/10(Tue) 15:31) #92311

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信