次の方法で共有


行の状態と行のバージョン

ADO.NET では、行の状態とバージョンを使用してテーブル内の行を管理します。 行の状態は、行の状態を示します。行バージョンでは、現在の値、元の値、既定値など、変更時に行に格納される値が保持されます。 たとえば、行の列に変更を加えた後、行の状態は Modified になり、現在の行の値を含む Current と、列が変更される前の行値を含む Original の 2 つの行バージョンが含まれます。

DataRow オブジェクトには、行の現在の状態を判断するために調べることができる RowState プロパティがあります。 次の表に、各 RowState 列挙値の簡単な説明を示します。

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

Detachedは、Remove メソッドを使用してDataRowCollectionから削除された行、または Delete メソッドの後に AcceptChanges メソッドによって削除された行にも設定されます。

DataSetDataTable、またはDataRowAcceptChangesが呼び出されると、行状態が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 行の現在の値。 この行バージョンは、DeletedRowStateを持つ行には存在しません。
Default 特定の行の既定の行バージョン。 AddedModified、またはDeleted行の既定の行バージョンがCurrentDetached行の既定の行バージョンはProposed
Original 行の元の値。 この行バージョンは、AddedRowStateを持つ行には存在しません。
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();  
}  

こちらも参照ください