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 :

En général cette erreur
Code :

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