行の状態とバージョンRow States and Row Versions

ADO.NET は、行の状態とバージョンを使用してテーブル内の行を管理します。ADO.NET manages rows in tables using row states and versions. 行状態は、1 つの行のステータスを示します。行バージョンは、1 つの行の値が変更されるときに、変更に応じてその行に格納される現在の値、元の値、既定値などを維持します。A row state indicates the status of a row; row versions maintain the values stored in a row as it is modified, including current, original, and default values. たとえば、ある行の 1 つの列を変更すると、この行の状態は Modified になり、次の 2 つの行バージョンが存在することになります。Current には現在の行値が格納され、Original にはその列が変更される前の行値が格納されます。For example, after you have made a modification to a column in a row, the row will have a row state of Modified, and two row versions: Current, which contains the current row values, and Original, which contains the row values before the column was modified.

DataRow オブジェクトにある RowState プロパティを調べると、行の現在の状態を確認できます。Each DataRow object has a RowState property that you can examine to determine the current state of the row. RowState 列挙値ごとの簡単な説明を次の表に示します。The following table gives a brief description of each RowState enumeration value.

RowState の値RowState value 説明Description
Unchanged AcceptChanges が最後に呼び出されてから、または DataAdapter.Fill によって行が作成されてから変更は行われていません。No changes have been made since the last call to AcceptChanges or since the row was created by DataAdapter.Fill.
Added 行がテーブルに追加されましたが、AcceptChanges が呼び出されていません。The row has been added to the table, but AcceptChanges has not been called.
Modified 行のいくつかの要素が変更されました。Some element of the row has been changed.
Deleted 行がテーブルから削除されましたが、AcceptChanges が呼び出されていません。The row has been deleted from a table, and AcceptChanges has not been called.
Detached 行がどの DataRowCollection にも属していません。The row is not part of any DataRowCollection. 新しく作成された行の RowStateDetached に設定されます。The RowState of a newly created row is set to Detached. DataRow メソッドを呼び出して新しい DataRowCollectionAdd に追加すると、RowState プロパティの値は Added に設定されます。After the new DataRow is added to the DataRowCollection by calling the Add method, the value of the RowState property is set to Added.

Detached は、DataRowCollection メソッドを使用するか、または Remove メソッドに続いて Delete メソッドを使用して AcceptChanges から削除された行に対しても設定されます。Detached is also set for a row that has been removed from a DataRowCollection using the Remove method, or by the Delete method followed by the AcceptChanges method.

AcceptChangesDataSet、または DataTableDataRow が呼び出されると、Deleted の行状態を持つすべての行が削除されます。When AcceptChanges is called on a DataSet, DataTable , or DataRow, all rows with a row state of Deleted are removed. 残りの行の行状態は Unchanged になり、Original 行バージョンの値は Current 行バージョンの値で上書きされます。The remaining rows are given a row state of Unchanged, and the values in the Original row version are overwritten with the Current row version values. RejectChanges が呼び出されると、Added の行状態を持つすべての行が削除されます。When RejectChanges is called, all rows with a row state of Added are removed. 残りの行の行状態は Unchanged になり、Current 行バージョンの値は Original 行バージョンの値で上書きされます。The remaining rows are given a row state of Unchanged, and the values in the Current row version are overwritten with the Original row version values.

DataRowVersion パラメーターと列参照を渡すことにより、ある行の行バージョンを表示する例を次に示します。You can view the different row versions of a row by passing a DataRowVersion parameter with the column reference, as shown in the following example.

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 列挙値ごとの簡単な説明を次の表に示します。The following table gives a brief description of each DataRowVersion enumeration value.

DataRowVersion の値DataRowVersion value 説明Description
Current 行の現在の値。The current values for the row. この行バージョンは、RowStateDeleted を持つ行については存在しません。This row version does not exist for rows with a RowState of Deleted.
Default 特定の行の既定の行バージョン。The default row version for a particular row. AddedModified、または Deleted 行の既定の行バージョンは、Current です。The default row version for an Added, Modified, or Deleted row is Current. Detached 行の既定の行バージョンは、Proposed です。The default row version for a Detached row is Proposed.
Original 行の元の値。The original values for the row. この行バージョンは、RowStateAdded を持つ行については存在しません。This row version does not exist for rows with a RowState of Added.
Proposed 行に対して提示された値。The proposed values for the row. この行バージョンは、行、つまり DataRowCollection の一部ではない行に対する編集操作の間存在します。This row version exists during an edit operation on a row, or for a row that is not part of a DataRowCollection.

DataRow メソッドを呼び出して HasVersion を引数として渡すことにより、DataRowVersion が特定の行バージョンを持っているかどうかを確認できます。You can test whether a DataRow has a particular row version by calling the HasVersion method and passing a DataRowVersion as an argument. たとえば、DataRow.HasVersion(DataRowVersion.Original) は、新しく追加された行に対して false が呼び出されていない場合に AcceptChanges を返します。For example, DataRow.HasVersion(DataRowVersion.Original) will return false for newly added rows before AcceptChanges has been called.

テーブルから削除されたすべての行の値を表示するコード サンプルを次に示します。The following code example displays the values in all the deleted rows of a table. Deleted 行には Current 行バージョンがないため、列値にアクセスするときに DataRowVersion.Original を渡す必要があります。Deleted rows do not have a Current row version, so you must pass DataRowVersion.Original when accessing the column values.

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();  
}  

関連項目See also