juin
2007
Imaginons le cas suivant :
On a une DataTable avec une colonne 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. »).
Du coup, il va falloir supprmier les rows ajoutées, faire un RejectChanges sur les rows modifiées 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 l’utiliser sans faire de Select sur la table originale pour retrouver la row associée, je suis intéressé.
Exact mais c’est quand même dommage que le RejectChanges ne le fasse pas. Je ne vois pas dans cas où c’est intéressant qu’il ne le fasse pas.
Bon, selon reflector,
Essaye de désactiver la propriété EnforceConstraints du dataSet si ta table appartient à un dataset.
Sinon tente le code suivant:
table.BeginLoadData(); //a pour effet entre autres de désactiver les contraintes
table.RejectChanges();
table.EndLoadData();