行の状態とバージョン

ADO.NET は、行の状態とバージョンを使用してテーブル内の行を管理します。 行状態は、1 つの行のステータスを示します。行バージョンは、1 つの行の値が変更されるときに、変更に応じてその行に格納される現在の値、元の値、既定値などを維持します。 たとえば、ある行の 1 つの列を変更すると、この行の状態は Modified になり、次の 2 つの行バージョンが存在することになります。Current には現在の行値が格納され、Original にはその列が変更される前の行値が格納されます。

DataRow オブジェクトにある RowState プロパティを調べると、行の現在の状態を確認できます。 RowState 列挙値ごとの簡単な説明を次の表に示します。

RowState の値

説明

Unchanged

AcceptChanges が最後に呼び出されてから、または DataAdapter.Fill によって行が作成されてから変更は行われていません。

Added

行がテーブルに追加されましたが、AcceptChanges が呼び出されていません。

Modified

行のいくつかの要素が変更されました。

Deleted

行がテーブルから削除されましたが、AcceptChanges が呼び出されていません。

Detached

行がどの DataRowCollection にも属していません。 新しく作成された行の RowState は Detached に設定されます。 Add メソッドを呼び出して新しい DataRow を DataRowCollection に追加すると、RowState プロパティの値は Added に設定されます。

Detached は、Remove メソッドを使用するか、または Delete メソッドに続いて AcceptChanges メソッドを使用して DataRowCollection から削除された行に対しても設定されます。

DataSetDataTable、または DataRow の AcceptChanges が呼び出されると、Deleted の行状態を持つすべての行が削除されます。 残りの行の行状態は Unchanged になり、Current 行バージョンの値は Original 行バージョンの値で上書きされます。 RejectChanges が呼び出されると、Added の行状態を持つすべての行が削除されます。 残りの行の行状態は Unchanged になり、Original 行バージョンの値は Current 行バージョンの値で上書きされます。

DataRowVersion パラメーターと列参照を渡すことにより、ある行の行バージョンを表示する例を次に示します。

Dim custRow As DataRow = custTable.Rows(0)
Dim custID As String = custRow("CustomerID", DataRowVersion.Original).ToString()
DataRow custRow = custTable.Rows[0];
string custID = custRow["CustomerID", DataRowVersion.Original].ToString();

DataRowVersion 列挙値ごとの簡単な説明を次の表に示します。

DataRowVersion の値

説明

Current

行の現在の値。 この行バージョンは、Deleted の RowState を持つ行については存在しません。

Default

特定の行の既定の行バージョン。 Added、Modified、または Unchanged 行の既定の行バージョンは、Current です。 Deleted 行の既定の行バージョンは、Original です。 Detached 行の既定の行バージョンは、Proposed です。

Original

行の元の値。 この行バージョンは、Added の RowState を持つ行については存在しません。

Proposed

行に対して提示された値。 この行バージョンは、行、つまり DataRowCollection の一部ではない行に対する編集操作の間存在します。

HasVersion メソッドを呼び出して DataRowVersion を引数として渡すことにより、DataRow が特定の行バージョンを持っているかどうかを確認できます。 たとえば、DataRow.HasVersion(DataRowVersion.Original) は、新しく追加された行に対して AcceptChanges が呼び出されていない場合に false を返します。

テーブルから削除されたすべての行の値を表示するコード サンプルを次に示します。 Deleted 行には Current 行バージョンがないため、列値にアクセスするときに DataRowVersion.Original を渡す必要があります。

Dim catTable As DataTable = catDS.Tables("Categories")

Dim delRows() As DataRow = catTable.Select(Nothing, Nothing, DataViewRowState.Deleted)

Console.WriteLine("Deleted rows:" & vbCrLf)

Dim catCol As DataColumn
Dim delRow As DataRow

For Each catCol In catTable.Columns
  Console.Write(catCol.ColumnName & vbTab)
Next
Console.WriteLine()

For Each delRow In delRows
  For Each catCol In catTable.Columns
    Console.Write(delRow(catCol, DataRowVersion.Original) & vbTab)
  Next
  Console.WriteLine()
Next
DataTable catTable = catDS.Tables["Categories"];

DataRow[] delRows = catTable.Select(null, null, DataViewRowState.Deleted);

Console.WriteLine("Deleted rows:\n");

foreach (DataColumn catCol in catTable.Columns)
  Console.Write(catCol.ColumnName + "\t");
Console.WriteLine();

foreach (DataRow delRow in delRows)
{
  foreach (DataColumn catCol in catTable.Columns)
    Console.Write(delRow[catCol, DataRowVersion.Original] + "\t");
  Console.WriteLine();
}

参照

その他の技術情報

DataTable 内のデータの操作

DataSets、DataTables、および DataViews (ADO.NET)

DataAdapter と DataReader (ADO.NET)