BOnjour à tous,
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 :
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 .En général cette erreur
Code :
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 !Violation de l'accès concurrentiel : DeleteCommand a affecté 0 des enregistrements 1 attendus."
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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();
Partager