行の状態とバージョン

更新 : November 2007

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)