juin
2007
Imaginons le cas suivant :
On a une DataTable avec une colonne marquée unique.
On supprime une Row du dataset.
Ensuite, on ajoute une Row avec la même clé que la Row supprimée.
Puis on fait un RejectChanges sur la table. Cette dernière instruction génère l’exception ConstraintException (« La colonne ‘Column1′ doit être unique. La valeur ‘key1′ est déjà présente. »).
Pour éviter cela, il va falloir supprimer les rows ajoutées, faire un RejectChanges sur les rows modifiées (au cas où on aurait affecter la valeur de la colonne unique de la row supprimée) puis seulement faire un RejectChanges sur la table :
table.Columns.Add("key").Unique = true;
DataRow row1 = table.NewRow();
row1["key"] = "key1";
table.Rows.Add(row1);
DataRow row2 = table.NewRow();
row2["key"] = "key2";
table.Rows.Add(row2);
DataRow row3 = table.NewRow();
row3["key"] = "key3";
table.Rows.Add(row3);
table.AcceptChanges();
row1.Delete();
DataRow newRow1 = table.NewRow();
newRow1["key"] = "key1";
table.Rows.Add(newRow1);
row2.Delete();
row3["key"] = "key2";
//DataTable changedTable = table.GetChanges(DataRowState.Added);
//if (changedTable != null)
for (int indexRow = 0; indexRow < table.Rows.Count; indexRow++)
{
DataRow addedRow = table.Rows[indexRow];
if (addedRow.RowState == DataRowState.Added) // Pour ce genre de trucs, LINQ c'est vraiment Top !
{
table.Rows.Remove(addedRow);
indexRow--;
}
}
//changedTable = table.GetChanges(DataRowState.Modified);
//if (changedTable != null)
foreach (DataRow modifiedRow in table.Rows)
if (modifiedRow.RowState == DataRowState.Modified)
modifiedRow.RejectChanges();
table.RejectChanges();
Par contre, je n’ai pas réussi à utiliser intelligemment table.GetChanges. En effet, les rows retournées par cette méthode sont des copies des rows de la table originale.
Si quelqu’un sait comment récupérer la row originale (sans faire de select sur la table originale), à partir de la row retournée par GetChanges, n’hésitez pas à mettre un commentaire. Merci d’avance