Freigeben über


Zeilenstatus und Zeilenversion

ADO.NET verwaltet Zeilen in Tabellen mit Hilfe 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 aufbewahrt, z. B. Current, Original und Default. Beispielsweise hat eine Zeile, nachdem Sie eine Spalte in der Zeile geändert haben, den Zeilenstatus Modified, und es sind zwei Zeilenversionen vorhanden: Current, die die aktuellen Zeilenwerte enthält, und Original, die die Zeilenwerte vor der Änderung der Spalte enthält.

Jedes DataRow-Objekt hat eine RowState-Eigenschaft, die Sie auf den aktuellen Status der Zeile hin untersuchen können. In der folgenden Tabelle werden die einzelnen RowState-Enumerationswerte kurz beschrieben.

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

Detached wird auch für eine Zeile festgelegt, die mit der Remove-Methode aus einer DataRowCollection entfernt wurde, bzw. durch die Delete-Methode, gefolgt von der AcceptChanges-Methode.

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

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

Dim custRow As DataRow = custTable.Rows(0)
Dim custID As String = custRow("CustomerID", DataRowVersion.Original).ToString()
[C#]
DataRow custRow = custTable.Rows[0];
string custID = custRow["CustomerID", DataRowVersion.Original].ToString();

In der folgenden Tabelle werden die einzelnen DataRowVersion-Enumerationswerte kurz beschrieben.

DataRowVersion Beschreibung
Current Die aktuellen Werte für die Zeile. Diese Zeilenversion ist für Zeilen mit dem RowState Deleted nicht vorhanden.
Default Die Standardzeilenversion für eine bestimmte Zeile. Die Standardzeilenversion für eine Zeile mit dem Wert Added, Modified oder Unchanged lautet Current. Die Standardzeilenversion für eine Deleted-Zeile lautet Original. Die Standardzeilenversion für eine Detached-Zeile lautet Proposed.
Original Die ursprünglichen Werte für die Zeile. Diese Zeilenversion ist für Zeilen mit dem RowState Added nicht vorhanden.
Proposed Die vorgeschlagenen Werte für die Zeile. Diese Zeilenversion ist vorhanden, während eine Zeile bearbeitet wird, bzw. 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. Beispielsweise gibt DataRow.HasVersion(DataRowVersion.Original) für neu hinzugefügte Zeilen vom dem Aufruf von AcceptChanges den Wert false zurück.

Im folgenden Codebeispiel werden die Werte in allen gelöschten Zeilen einer Tabelle angezeigt. Gelöschte Zeilen haben keine Current-Zeilenversion, daher müssen Sie DataRowVersion.Original übergeben, wenn Sie auf die Spaltenwerte zugreifen.

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
[C#]
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

Bearbeiten von Daten in einer Datentabelle | DataRowCollection-Klasse | DataRow.RowState-Eigenschaft | DataRowVersion-Enumeration | DataViewRowState-Enumeration