ADO.NET 使用行状态和版本管理数据表中的行。 行状态指示行的状态;行版本在修改行时保留存储在行中的值,包括当前值、原始值和默认值。 例如,在对行中的列进行了修改之后,该行将具有行状态 Modified
和两个行版本: Current
包含当前行值,以及 Original
包含列修改前的行值。
每个 DataRow 对象都有一个 RowState 属性,可以检查以确定行的当前状态。 下表简要介绍了每个 RowState
枚举值。
RowState 值 | DESCRIPTION |
---|---|
Unchanged | 自上次调用 AcceptChanges 或创建 DataAdapter.Fill 行以来,没有做出任何更改。 |
Added | 该行已添加到表中,但 AcceptChanges 尚未调用。 |
Modified | 行中的某个元素已被更改。 |
Deleted | 该行已从表中删除,并且 AcceptChanges 尚未调用。 |
Detached | 该行不是任何 DataRowCollection 行的一部分。 新创建的行的 RowState 设置为 Detached 。 调用DataRow 方法后,将新的DataRowCollection 内容添加到Add 中,属性RowState 的值将被设置为Added 。将使用 Detached 方法,或使用 DataRowCollection 方法接着使用 Remove 方法从 Delete 中移除的行也设置为 AcceptChanges 。 |
调用AcceptChanges
时,所有行状态为DataSet的行在DataTable、DataRow或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 值 | DESCRIPTION |
---|---|
Current | 行的当前值。 如果行的 RowState 为 Deleted ,则不存在此行版本。 |
Default | 特定行的默认行版本。
Added 、Modified 或Deleted 行的默认行版本是Current 。
Detached 行的默认行版本是 Proposed 。 |
Original | 行的原始值。 如果行的 RowState 为 Added ,则不存在此行版本。 |
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();
}