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