Zeilenstatus und Zeilenversionen

ADO.NET verwaltet Zeilen in Tabellen mithilfe des Zeilenstatus und der Zeilenversion. 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. 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.

Jedes DataRow-Objekt hat eine RowState-Eigenschaft, über die Sie den aktuellen Status der Zeile überprüfen können. Die folgende Tabelle enthält eine kurze Beschreibung aller RowState-Enumerationswerte.

"RowState"-Wert BESCHREIBUNG
Unchanged Seit dem letzten Aufruf von AcceptChanges oder seit der Erstellung der Zeile durch DataAdapter.Fill wurden keine Änderungen ausgeführt.
Added Die Zeile wurde der Tabelle hinzugefügt, AcceptChanges wurde aber nicht aufgerufen.
Modified Ein Element der Zeile wurde geändert.
Deleted Die Zeile wurde aus einer Tabelle gelöscht, und AcceptChanges wurde nicht aufgerufen.
Detached Die Zeile ist nicht Teil einer DataRowCollection. Der RowState einer neu erstellten Zeile wird auf Detached festgelegt. Nach dem Hinzufügen der neuen DataRow zur DataRowCollection durch Aufrufen der Add-Methode wird der Wert der RowState-Eigenschaft auf Added festgelegt.

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.

Wenn AcceptChanges für einen DataSet, eine DataTable oder eine DataRow aufgerufen wird, werden alle Zeilen mit dem Zeilenstatus Deleted entfernt. Die verbleibenden Zeilen erhalten den Zeilenstatus Unchanged, und die Werte in der Zeilenversion Original werden mit den Werten der Zeilenversion Current überschrieben. Wenn RejectChanges aufgerufen wird, werden alle Zeilen mit dem Zeilenstatus Added entfernt. Die verbleibenden Zeilen erhalten den Zeilenstatus Unchanged, und die Werte in der Zeilenversion Current werden mit den Werten der Zeilenversion Original überschrieben.

Sie können die verschiedenen Zeilenversionen einer Zeile anzeigen, indem Sie einen DataRowVersion-Parameter mit dem Spaltenverweis übergeben. Dies wird im folgenden Beispiel dargestellt.

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.

"DataRowVersion"-Wert BESCHREIBUNG
Current Die aktuellen Werte der Zeile. Diese Zeilenversion ist für Zeilen, deren RowState auf Deleted festgelegt ist, nicht vorhanden.
Default Die Standardzeilenversion einer bestimmten Zeile. Die Standardzeilenversion für eine Zeile mit dem Status Added, Modified oder Deleted lautet Current. Die Standardzeilenversion für eine Zeile mit dem Status Detached lautet Proposed.
Original Die ursprünglichen Werte der Zeile. Diese Zeilenversion ist für Zeilen, deren RowState auf Added festgelegt ist, nicht vorhanden.
Proposed Die vorgeschlagenen Werte für die Zeile. Diese Zeilenversion ist während der Bearbeitung einer Zeile vorhanden oder wird für Zeilen verwendet, die nicht Teil einer DataRowCollection sind.

Sie können überprüfen, ob eine DataRow eine bestimmte Zeilenversion aufweist, indem Sie die HasVersion-Methode aufrufen und eine DataRowVersion als Argument übergeben. So gibt z. B. DataRow.HasVersion(DataRowVersion.Original) für neu hinzugefügte Zeilen vor dem Aufrufen von false den Wert AcceptChanges zurück.

Im folgenden Codebeispiel werden die Werte in allen gelöschten Zeilen einer Tabelle angezeigt. Deleted-Zeilen haben keine Current-Zeilenversion. Deshalb müssen Sie beim Zugriff auf die Spaltenwerte DataRowVersion.Original übergeben.

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 auch