Dela via


Radtillstånd och radversioner

ADO.NET hanterar rader i tabeller med hjälp av radtillstånd och versioner. Ett radtillstånd anger status för en rad. radversioner underhåller de värden som lagras på en rad när de ändras, inklusive aktuella, ursprungliga och standardvärden. När du till exempel har ändrat en kolumn i en rad har raden radtillståndet Modified, och två radversioner: Current, som innehåller de aktuella radvärdena och Original, som innehåller radvärdena innan kolumnen ändrades.

Varje DataRow objekt har en RowState egenskap som du kan undersöka för att fastställa radens aktuella tillstånd. I följande tabell ges en kort beskrivning av varje RowState uppräkningsvärde.

RowState-värde beskrivning
Unchanged Inga ändringar har gjorts sedan det senaste anropet till AcceptChanges eller sedan raden skapades av DataAdapter.Fill.
Added Raden har lagts till i tabellen, men AcceptChanges har inte anropats.
Modified En del av raden har ändrats.
Deleted Raden har tagits bort från en tabell och AcceptChanges har inte anropats.
Detached Raden är inte en del av någon DataRowCollection. För RowState en nyskapade rad är inställd på Detached. När det nya DataRow har lagts till i DataRowCollection genom att anropa Add metoden anges värdet för RowState egenskapen till Added.

Detached anges också för en rad som har tagits bort från en DataRowCollection med hjälp Remove av metoden eller av metoden Delete följt av AcceptChanges metoden.

När AcceptChanges anropas på en DataSet, DataTable , eller DataRow, tas alla rader med radtillståndet Deleted bort. De återstående raderna får radtillståndet Unchanged, och värdena i Original radversionen skrivs över med radversionsvärdena Current . När RejectChanges anropas tas alla rader med radtillståndet Added bort. De återstående raderna får radtillståndet Unchanged, och värdena i Current radversionen skrivs över med radversionsvärdena Original .

Du kan visa de olika radversionerna av en rad genom att skicka en DataRowVersion parameter med kolumnreferensen, som du ser i följande exempel.

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

I följande tabell ges en kort beskrivning av varje DataRowVersion uppräkningsvärde.

DataRowVersion-värde beskrivning
Current Aktuella värden för raden. Den här radversionen finns inte för rader med värdet RowState Deleted.
Default Standardradversionen för en viss rad. Standardradversionen för en Added, , eller Deleted -rad är CurrentModified. Standardradversionen för en Detached rad är Proposed.
Original De ursprungliga värdena för raden. Den här radversionen finns inte för rader med värdet RowState Added.
Proposed De föreslagna värdena för raden. Den här radversionen finns under en redigeringsåtgärd på en rad eller för en rad som inte ingår i en DataRowCollection.

Du kan testa om en DataRow har en viss radversion genom att anropa HasVersion metoden och skicka en DataRowVersion som ett argument. Till exempel DataRow.HasVersion(DataRowVersion.Original) returneras false för nyligen tillagda rader innan AcceptChanges har anropats.

I följande kodexempel visas värdena i alla borttagna rader i en tabell. Deleted raderna har Current ingen radversion, så du måste skicka DataRowVersion.Original när du kommer åt kolumnvärdena.

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

Se även