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

わんくま同盟

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

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

■92315 / 2階層)  DBのレコード追加
□投稿者/ ぽんた (2回)-(2019/09/10(Tue) 16:06:37)
No92314 (魔界の仮面弁士 さん) に返信
> ■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


返信ありがとうございます。
おそらく私はaddをしたあと、AcceptChanges メソッドせずにaddしてエラーになるのですが、
これがどういう理由でエラーになるのかがわかりません。
なぜなのでしょうか?
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[1]: DBのレコード追加 /魔界の仮面弁士 →Re[3]: DBのレコード追加 /魔界の仮面弁士
 
上記関連ツリー

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

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