Zeilenstatus und ZeilenversionenRow States and Row Versions

ADO.NET verwaltet Zeilen in Tabellen mithilfe des Zeilenstatus und der Zeilenversion.ADO.NET manages rows in tables using row states and versions. Ein Zeilenstatus gibt den Status einer Zeile an. In Zeilenversionen werden die Werte, die in einer Zeile gespeichert werden, während der Bearbeitung verwaltet. Zu diesen Werten zählen z. B. die Werte current, original und default.A row state indicates the status of a row; row versions maintain the values stored in a row as it is modified, including current, original, and default values. Wenn Sie beispielsweise eine Spalte in einer Zeile geändert haben, weist die Zeile den Zeilenstatus Modified und die folgenden beiden Zeilenversionen auf: Current mit den aktuellen Zeilenwerten und Original mit den Zeilenwerten vor den Änderungen der Spalte.For example, after you have made a modification to a column in a row, the row will have a row state of Modified, and two row versions: Current, which contains the current row values, and Original, which contains the row values before the column was modified.

Jedes DataRow-Objekt hat eine RowState-Eigenschaft, über die Sie den aktuellen Status der Zeile überprüfen können.Each DataRow object has a RowState property that you can examine to determine the current state of the row. Die folgende Tabelle enthält eine kurze Beschreibung aller RowState-Enumerationswerte.The following table gives a brief description of each RowState enumeration value.

"RowState"-WertRowState value BeschreibungDescription
Unchanged Seit dem letzten Aufruf von AcceptChanges oder seit der Erstellung der Zeile durch DataAdapter.Fill wurden keine Änderungen ausgeführt.No changes have been made since the last call to AcceptChanges or since the row was created by DataAdapter.Fill.
Added Die Zeile wurde der Tabelle hinzugefügt, AcceptChanges wurde aber nicht aufgerufen.The row has been added to the table, but AcceptChanges has not been called.
Modified Ein Element der Zeile wurde geändert.Some element of the row has been changed.
Deleted Die Zeile wurde aus einer Tabelle gelöscht, und AcceptChanges wurde nicht aufgerufen.The row has been deleted from a table, and AcceptChanges has not been called.
Detached Die Zeile ist nicht Teil einer DataRowCollection.The row is not part of any DataRowCollection. Der RowState einer neu erstellten Zeile wird auf Detached festgelegt.The RowState of a newly created row is set to Detached. Nach dem Hinzufügen der neuen DataRow zur DataRowCollection durch Aufrufen der Add-Methode wird der Wert der RowState-Eigenschaft auf Added festgelegt.After the new DataRow is added to the DataRowCollection by calling the Add method, the value of the RowState property is set to Added.

Detached wird auch für eine Zeile festgelegt, die mit der DataRowCollection-Methode bzw. mit der Remove-Methode, gefolgt von der Delete-Methode, aus einer AcceptChanges entfernt wurde.Detached is also set for a row that has been removed from a DataRowCollection using the Remove method, or by the Delete method followed by the AcceptChanges method.

Wenn AcceptChanges für einen DataSet, eine DataTable oder eine DataRow aufgerufen wird, werden alle Zeilen mit dem Zeilenstatus Deleted entfernt.When AcceptChanges is called on a DataSet, DataTable , or DataRow, all rows with a row state of Deleted are removed. Die verbleibenden Zeilen erhalten den Zeilenstatus Unchanged, und die Werte in der Zeilenversion Original werden mit den Werten der Zeilenversion Current überschrieben.The remaining rows are given a row state of Unchanged, and the values in the Original row version are overwritten with the Current row version values. Wenn RejectChanges aufgerufen wird, werden alle Zeilen mit dem Zeilenstatus Added entfernt.When RejectChanges is called, all rows with a row state of Added are removed. Die verbleibenden Zeilen erhalten den Zeilenstatus Unchanged, und die Werte in der Zeilenversion Current werden mit den Werten der Zeilenversion Original überschrieben.The remaining rows are given a row state of Unchanged, and the values in the Current row version are overwritten with the Original row version values.

Sie können die verschiedenen Zeilenversionen einer Zeile anzeigen, indem Sie einen DataRowVersion-Parameter mit dem Spaltenverweis übergeben. Dies wird im folgenden Beispiel dargestellt.You can view the different row versions of a row by passing a DataRowVersion parameter with the column reference, as shown in the following example.

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

Die folgende Tabelle enthält eine kurze Beschreibung aller DataRowVersion-Enumerationswerte.The following table gives a brief description of each DataRowVersion enumeration value.

"DataRowVersion"-WertDataRowVersion value BeschreibungDescription
Current Die aktuellen Werte der Zeile.The current values for the row. Diese Zeilenversion ist für Zeilen, deren RowState auf Deleted festgelegt ist, nicht vorhanden.This row version does not exist for rows with a RowState of Deleted.
Default Die Standardzeilenversion einer bestimmten Zeile.The default row version for a particular row. Die Standardzeilenversion für eine Zeile mit dem Status Added, Modified oder Deleted lautet Current.The default row version for an Added, Modified, or Deleted row is Current. Die Standardzeilenversion für eine Zeile mit dem Status Detached lautet Proposed.The default row version for a Detached row is Proposed.
Original Die ursprünglichen Werte der Zeile.The original values for the row. Diese Zeilenversion ist für Zeilen, deren RowState auf Added festgelegt ist, nicht vorhanden.This row version does not exist for rows with a RowState of Added.
Proposed Die vorgeschlagenen Werte für die Zeile.The proposed values for the row. Diese Zeilenversion ist während der Bearbeitung einer Zeile vorhanden oder wird für Zeilen verwendet, die nicht Teil einer DataRowCollection sind.This row version exists during an edit operation on a row, or for a row that is not part of a DataRowCollection.

Sie können überprüfen, ob eine DataRow eine bestimmte Zeilenversion aufweist, indem Sie die HasVersion-Methode aufrufen und eine DataRowVersion als Argument übergeben.You can test whether a DataRow has a particular row version by calling the HasVersion method and passing a DataRowVersion as an argument. So gibt z. B. DataRow.HasVersion(DataRowVersion.Original) für neu hinzugefügte Zeilen vor dem Aufrufen von false den Wert AcceptChanges zurück.For example, DataRow.HasVersion(DataRowVersion.Original) will return false for newly added rows before AcceptChanges has been called.

Im folgenden Codebeispiel werden die Werte in allen gelöschten Zeilen einer Tabelle angezeigt.The following code example displays the values in all the deleted rows of a table. Deleted-Zeilen haben keine Current-Zeilenversion. Deshalb müssen Sie beim Zugriff auf die Spaltenwerte DataRowVersion.Original übergeben.Deleted rows do not have a Current row version, so you must pass DataRowVersion.Original when accessing the column values.

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

Siehe auchSee also