Problème avec méthode UpdateCommand
BOnjour à tous, :lol:
J'ai posté 2 questions la semaine dernière sur l'utilisation des DataAdapters et DataSets car j'avais systématiquement une erreur de violation d'accès concurrentiel. Un post de Benzeghiba m'a beaucoup aide en me disant ceci :
Citation:
En général cette erreur
Code :
Citation:
Violation de l'accès concurrentiel : DeleteCommand a affecté 0 des enregistrements 1 attendus."
se produit lorsque tu supprime une ligne (DataRow) de ton DataSet puis tu exécutes la suppression réelle (dataadapter.update) mais ccette opération ne trouve pas dans la DB les lignes qui ont été supprimées du DataSet, par ne les trouve pas je veux dire la clause where de ta requete delete ne correspond à aucune ligne !
Je pense que je n'ai foncièrement pas compris comment marche un DataSet. j'ai épluché tous les tuto que j'ai pu trouver, mais aucun ne traite un cas complet de connexion à une base sql avec les objets sqlconnection avec une mise à jour, suppression ou ajout d'une ligne dans un dataset puis dans une table comme je .
Voici un cas simple que j'essaie de réaliser : un dataset (rempli à partir d'une table "TableNewsletter" via la méthode fill, ca ca fonctionne) contient des informations liées à un user, notamment, son mail. Je veux updater toutes les lignes de ce dataset en changeant le mail par un nouveau. Voici mon code ca plante (Violation d'accès concurrentiel lors du DataAdapter.Update) et je ne comprend pas pourquoi. Quelqu'un pourrait-il commenter mon code en me disant où est le souci? Merci beaucoup d'avance....
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
// Méthode de connexion à la base sqlserver 2005
SqlConnection Connexion = ConnexionBase();
SqlDataAdapter SqlDataAdapter1;
SqlDataAdapter1 = new SqlDataAdapter();
// Remplissage de la commande UpdateCommand. La condition update toutes les lignes qui contiennent l'ancien mail
SqlDataAdapter1.UpdateCommand = new SqlCommand(
"UPDATE " + TableNewsletter + " SET " + ChampEmailNewsletterBase + "= @" + ChampEmailNewsletterBase +
" WHERE " + ChampEmailNewsletterBase + "='" + OldEmail +"'",Connexion);
//Création du paramètre qui contient le nouvel email
SqlParameter ParamMail = new SqlParameter("@" + ChampEmailNewsletterBase, SqlDbType.VarChar, 50, ChampEmailNewsletterBase);
ParamMail.Value = NewEmail;
// Ajout du paramètre à la commande
SqlDataAdapter1.UpdateCommand.Parameters.Add(ParamMail);
try
{
//Modification dans le dataset
foreach (DataRow Row in DataSetOrigine.Tables[TableNewsletter].Rows)
{
Row[ChampEmailNewsletterBase] = NewEmail;
}
//Mise à jour
SqlDataAdapter1.Update(DataSetOrigine, TableNewsletter);
}
catch (Exception exc)
{
throw new Exception(exc.Message);
}
Connexion.Close();
Connexion.Dispose();
// Commit des modifs car dataset utilisé après
DataSetOrigine.AcceptChanges(); |