États et versions de ligne

ADO.NET gère les lignes des tables à l'aide des états et des versions de ligne. Un état de ligne indique l'état 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 d'une ligne, la ligne a un état de ligne Modified, et il existe deux versions de ligne : Current, qui contient les valeurs de ligne actuelles et Original, qui contient les valeurs de ligne avant 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 donne une brève description de chaque valeur d'énumération RowState.

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 méthode AcceptChanges n'a pas été appelée.
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 Detached est défini pour une ligne qui a été créée mais qui ne fait pas partie d'un DataRowCollection. Le RowState d'une ligne 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ée sur un DataSet, DataTable ou DataRow, toutes les lignes ayant 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ée, toutes les lignes ayant 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 visualiser 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()
[C#]
DataRow custRow = custTable.Rows[0];
string custID = custRow["CustomerID", DataRowVersion.Original].ToString();

Le tableau suivant donne une brève description de chaque valeur d'énumération DataRowVersion.

DataRowVersion Description
Current Les valeurs actuelles de la ligne. Cette version de ligne n'existe pas pour les lignes dont le RowState est 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 Unchanged est Current. La version de ligne par défaut d'une ligne Deleted est Original. 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 a une version de ligne particulière en appelant la méthode HasVersion et en passant 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 de toutes les lignes supprimées d'une table. Les lignes supprimées n'ont pas de version de ligne Current. Vous devez donc passer DataRowVersion.Original lorsque vous accédez aux valeurs de colonnes.

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

Voir aussi

Manipulation de données dans un DataTable | DataRowCollection, classe | RowState | DataRowVersion, énumération | DataViewRowState, énumération