行状态和行版本

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的行在DataTableDataRowDeleted中被删除。 其余行的行状态为 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 行的当前值。 如果行的 RowStateDeleted,则不存在此行版本。
Default 特定行的默认行版本。 AddedModifiedDeleted行的默认行版本是CurrentDetached 行的默认行版本是 Proposed
Original 行的原始值。 如果行的 RowStateAdded,则不存在此行版本。
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();  
}  

另请参阅