É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 RowStateDeleted.
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 RowStateAdded.
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();  
}  

Voir aussi