ADO.NET では、行の状態とバージョンを使用してテーブル内の行を管理します。 行の状態は、行の状態を示します。行バージョンでは、現在の値、元の値、既定値など、変更時に行に格納される値が保持されます。 たとえば、行の列に変更を加えた後、行の状態は Modified
になり、現在の行の値を含む Current
と、列が変更される前の行値を含む Original
の 2 つの行バージョンが含まれます。
各 DataRow オブジェクトには、行の現在の状態を判断するために調べることができる RowState プロパティがあります。 次の表に、各 RowState
列挙値の簡単な説明を示します。
RowState 値 | 説明 |
---|---|
Unchanged |
AcceptChanges の最後の呼び出し以降、または行がDataAdapter.Fill によって作成されてから、変更は行われません。 |
Added | 行がテーブルに追加されましたが、 AcceptChanges が呼び出されていません。 |
Modified | 行の一部の要素が変更されました。 |
Deleted | 行がテーブルから削除され、 AcceptChanges が呼び出されていません。 |
Detached | 行は DataRowCollection の一部ではありません。 新しく作成された行の RowState は、 Detached に設定されます。
Add メソッドを呼び出して新しいDataRow をDataRowCollection に追加すると、RowState プロパティの値がAdded に設定されます。Detached は、Remove メソッドを使用してDataRowCollection から削除された行、または Delete メソッドの後に AcceptChanges メソッドによって削除された行にも設定されます。 |
DataSet、DataTable、またはDataRowでAcceptChanges
が呼び出されると、行状態が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 | 行の現在の値。 この行バージョンは、Deleted のRowState を持つ行には存在しません。 |
Default | 特定の行の既定の行バージョン。
Added 、Modified 、またはDeleted 行の既定の行バージョンがCurrent 。
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();
}