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