行の状態とバージョン

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

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

RowState の値 説明
Unchanged AcceptChanges が最後に呼び出されてから、または DataAdapter.Fill によって行が作成されてから変更は行われていません。
Added 行がテーブルに追加されましたが、AcceptChanges が呼び出されていません。
Modified 行のいくつかの要素が変更されました。
Deleted 行がテーブルから削除されましたが、AcceptChanges が呼び出されていません。
Detached 行がどの DataRowCollection にも属していません。 新しく作成された行の RowStateDetached に設定されます。 DataRow メソッドを呼び出して新しい DataRowCollectionAdd に追加すると、RowState プロパティの値は Added に設定されます。

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

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

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 行の現在の値。 この行バージョンは、RowStateDeleted を持つ行については存在しません。
Default 特定の行の既定の行バージョン。 AddedModified、または Deleted 行の既定の行バージョンは、Current です。 Detached 行の既定の行バージョンは、Proposed です。
Original 行の元の値。 この行バージョンは、RowStateAdded を持つ行については存在しません。
Proposed 行に対して提示された値。 この行バージョンは、行、つまり DataRowCollection の一部ではない行に対する編集操作の間存在します。

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

テーブルから削除されたすべての行の値を表示するコード サンプルを次に示します。 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();  
}  

関連項目