資料列狀態和資料列版本

更新: November 2007

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。

DataSetDataTableDataRow 上呼叫 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 時。

您可以測試 DataRow 是否具有特定的資料列版本,方法是呼叫 HasVersion 方法,並將 DataRowVersion 當做引數傳遞。例如,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();
}

請參閱

其他資源

管理 DataTable 中的資料

DataSet、DataTable 及 DataView (ADO.NET)

DataAdapter 和 DataReader (ADO.NET)