États des lignes et versions des lignes
ADO.NET gère les lignes des tables à l'aide des états et des versions de ligne. Un état de ligne indique le statut d'une ligne ; les versions de ligne conservent les valeurs stockées dans une ligne pendant leur modification, notamment les valeurs actuelles, d'origine et par défaut. Par exemple, une fois qu'une modification a été apportée à une colonne dans une ligne, la ligne possède un état de ligne Modified
et deux versions de ligne : Current
, qui contient les valeurs de ligne actuelles et Original
, qui renferme les valeurs de ligne avant la modification de la colonne.
Chaque objet DataRow a la propriété RowState que vous pouvez examiner pour déterminer l'état actuel de la ligne. Le tableau suivant fournit une brève description de chacune des valeurs d'énumération RowState
.
Valeur RowState | Description |
---|---|
Unchanged | Aucune modification n'a été apportée depuis le dernier appel à AcceptChanges ou depuis la création de la ligne par DataAdapter.Fill . |
Added | La ligne a été ajoutée à la table mais la AcceptChanges n'a pas été appelé. |
Modified | Certains éléments de la ligne ont été modifiés. |
Deleted | La ligne a été supprimée d'une table et AcceptChanges n'a pas été appelé. |
Detached | La ligne ne fait partie d'aucun DataRowCollection . Le RowState d'une ligne nouvellement créée prend la valeur Detached . Une fois le DataRow ajouté au DataRowCollection à l'aide de l'appel à la méthode Add , la propriété RowState prend la valeur Added .Detached est également défini pour une ligne qui a été supprimée d'un DataRowCollection à l'aide de la méthode Remove ou par la méthode Delete suivie de la méthode AcceptChanges . |
Lorsque AcceptChanges
est appelé sur un DataSet, DataTable, ou sur un DataRow, toutes les lignes avec un état de ligne Deleted
sont supprimées. Un état de ligne Unchanged
est attribué aux autres lignes et les valeurs de la version de ligne Original
sont remplacées par celles de la version de ligne Current
. Lorsque RejectChanges
est appelé, toutes les lignes avec un état de ligne Added
sont supprimées. Un état de ligne Unchanged
est attribué aux autres lignes et les valeurs de la version de ligne Current
sont remplacées par celles de la version de ligne Original
.
Vous pouvez afficher les différentes versions de ligne d'une ligne en passant un paramètre DataRowVersion avec la référence de colonne, comme le montre l'exemple suivant.
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();
Le tableau suivant fournit une brève description de chacune des valeurs d'énumération DataRowVersion
.
Valeur DataRowVersion | Description |
---|---|
Current | Les valeurs actuelles de la ligne. Cette version de ligne n'existe pas pour les lignes ayant un RowState Deleted . |
Default | Version de ligne par défaut d'une ligne particulière. La version de ligne par défaut d'une ligne Added , Modified ou Deleted est Current . La version de ligne par défaut d'une ligne Detached est Proposed . |
Original | Les valeurs d'origine de la ligne. Cette version de ligne n'existe pas pour les lignes ayant un RowState Added . |
Proposed | Les valeurs proposées de la ligne. Cette version de ligne existe pendant une opération de modification sur une ligne ou pour une ligne qui ne fait pas partie d'un DataRowCollection . |
Vous pouvez vérifier si un DataRow
possède une version de ligne particulière en appelant la méthode HasVersion et en transmettant un DataRowVersion
comme argument. Par exemple, DataRow.HasVersion(DataRowVersion.Original)
retournera la valeur false
pour des lignes qui ont été ajoutées avant l'appel à la méthode AcceptChanges
.
L'exemple de code suivant affiche les valeurs dans toutes les lignes supprimées d'une table. Les lignes Deleted
n'ont pas de version de ligne Current
, vous devez donc passer DataRowVersion.Original
lors de l'accès aux valeurs de colonne.
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();
}