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