共用方式為


資料列狀態和資料列版本

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

資料列的目前值。對於 RowStateDeleted 的資料列,其資料列版本不存在。

Default

指定資料列的預設資料列版本。AddedModifiedUnchanged 資料列的預設資料列版本為 CurrentDeleted 資料列的預設資料列版本為 OriginalDetached 資料列的預設資料列版本為 Proposed

Original

資料列的原始值。對於 RowStateAdded 的資料列,其資料列版本不存在。

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

請參閱

參考

DataRowCollection Class
DataRow.RowState Property
DataRowVersion Enumeration
DataViewRowState Enumeration

其他資源

管理 DataTable 中的資料