ADO.NET 用行状态和行版本管理表中的行。行状态指示行的状态;行版本在修改行中存储的值时维护各个阶段的值,包括当前值、原始值和默认值。例如,在修改了行中的某列后,该行的行状态将为 Modified,并且有两个行版本:Current(包含行的当前值)和 Original(包含列修改前行的值)。
每个 DataRow 对象都具有 RowState 属性,您可以检查此属性来确定行的当前状态。下表给出了对每个 RowState 枚举值的简要说明。
RowState 值 | 说明 |
---|---|
Unchanged | 自上次调用 AcceptChanges 之后,或自 DataAdapter.Fill 创建了行之后,未做出过任何更改。 |
Added | 已将行添加到表中,但尚未调用 AcceptChanges。 |
Modified | 已更改了行的某个元素。 |
Deleted | 已将该行从表中删除,并且尚未调用 AcceptChanges。 |
Detached | 该行不属于任何 DataRowCollection。新建行的 RowState 设置为 Detached。通过调用 Add 方法将新的 DataRow 添加到 DataRowCollection 之后,RowState 属性的值设置为 Added。 对于已经使用 Remove 方法(或是在使用 Delete 方法之后使用了 AcceptChanges 方法)从 DataRowCollection 中移除的行,也设置为 Detached。 |
在 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 | 行的当前值。对于 RowState 为 Deleted 的行,则不存在此行版本。 |
Default | 特定行的默认行版本。Added、Modified 或 Unchanged 行的默认行版本是 Current。Deleted 行的默认行版本是 Original。Detached 行的默认行版本是 Proposed。 |
Original | 行的原始值。对于 RowState 为 Added 的行,则不存在此行版本。 |
Proposed | 行的建议值。在对行进行编辑操作期间,或对于不属于 DataRowCollection 的行,存在此行版本。 |
通过调用 HasVersion 方法并将 DataRowVersion 作为参数传递,您可以测试 DataRow 是否具有特定的行版本。例如,在调用 AcceptChanges 之前,DataRow.HasVersion(DataRowVersion.Original) 对新添加的行将返回 false。
例如,以下代码示例显示了表中所有已删除行的值。Deleted 行没有 Current 行版本,因此在访问列值时必须传递 DataRowVersion.Original