BOnjour,
Tout d'abord ma config : XP SP3, SQL Management Studio 2005, Visual Studio 2005

J'ai un souci qui me rend un peu ... Alor qu'à priori je n'ai qu'une seule connexion ouverte, j'ai une erreur
"Violation de l'accès concurrentiel : DeleteCommand a affecté 0 des enregistrements 1 attendus."
. Voici la partie métier, pardon si c'est un peu long je pense que c'est nécessaire (le code est après:

Pour mon site, j'ai mis en place une newsletter. Cette newsletter porte sur différents thèmes, aussi les users qui s'y inscrivent doivent choisir le ou les thèmes qui les intéressent (par le biais d'une CheckBoxList, bindée sur la table qui contient les thèmes).

Pour corser un peu le tout, j'ai un espace membres mis en place avec l'appartenance asp.net (tout fonctionne à ce niveau). Les users qui s'inscrivent à la newsletter peuvent être membres, ou pas. Lorsqu'ils sont membres, le système facilité les choses en récupérant les infos de ces users et en préremplissant les contrôles (leur mail, leurs choix pour les thèmes de la newsletter s'ils se sont inscrits déjà et qu'ils veulent les modifier).

La table qui contient les utilisateurs inscrits à la newsletter contient un enregistrement par thème : si un user choisit les thèmes 1 & 2, il y aura 2 enregistrements dans la table, un par thème. Donc j'ai choisi, lors d'une modification, d'effacer les choix précédents qui ont été fait. Voici le code :

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
 /// <summary>
    /// Se produit lorsque l'on valide ses choix de newsletter
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Button_Click(object sender, EventArgs e)
    {
        SqlConnection Connexion = Commun.ConnexionBase();
        if (User.Identity.IsAuthenticated)
        {
            SqlDataAdapter SqlDataAdapter1;
            SqlDataAdapter1 = new SqlDataAdapter("SELECT * FROM " + Commun.AccesseurTableNewsletter, Connexion);
            DataSet DataSet1 = new DataSet("DataSet");
            SqlDataAdapter1.Fill(DataSet1, Commun.AccesseurTableNewsletter);
            SqlDataAdapter1.SelectCommand.Dispose();
            bool IsDeleting = false;
 
 
            // On efface toutes les données concernant ce user (avec son ancien mail) pour réécrire son nouveau choix après
            for (int i = 0; i < DataSet1.Tables[Commun.AccesseurTableNewsletter].Rows.Count; i++)
            {
                if (DataSet1.Tables[Commun.AccesseurTableNewsletter].Rows[i][Commun.AccesseurChampEmailNewsletterBase].ToString() == Membership.GetUser().Email)
                {
                      DataSet1.Tables[Commun.AccesseurTableNewsletter].Rows[i].Delete();
                    IsDeleting = true;
                }
            }
 
            if (IsDeleting)
            {
                // Remplissage de la commande DeleteCommand
                SqlDataAdapter1.DeleteCommand = new SqlCommand(
                   "DELETE FROM " +
                   Commun.AccesseurTableNewsletter +
                   " WHERE " + Commun.AccesseurChampEmailNewsletterBase + "=@" + Commun.AccesseurChampEmailNewsletterBase, Connexion);
 
 
                SqlDataAdapter1.DeleteCommand.Parameters.Add("@" + Commun.AccesseurChampEmailNewsletterBase, SqlDbType.VarChar, 50, Commun.AccesseurChampEmailNewsletterBase);
                SqlDataAdapter1.DeleteCommand.Parameters["@" + Commun.AccesseurChampEmailNewsletterBase].Value = TextBoxEmail.Text;
                try
                {
                    SqlDataAdapter1.Update(DataSet1, Commun.AccesseurTableNewsletter);
                }
                catch (Exception exc)
                {
 
                }
            }
 
            //Si le user choisi de répercuter la modif de son mail, alors on modifie aussi
            if ((TextBoxEmail.Text != Membership.GetUser().Email) && (Convert.ToBoolean(RadioButtonListChoixMail.SelectedValue)))
            {
                Membership.GetUser().Email = TextBoxEmail.Text; 
            }
            foreach (ListItem chkbox in CheckBoxListTypes.Items)
            {
                // Si la checkbox est 
                if (chkbox.Selected)
                {
                    // Remplissage de la commande InsertCommand
                    if(SqlDataAdapter1.InsertCommand == null)
                    {
                        SqlDataAdapter1.InsertCommand = new SqlCommand("INSERT INTO " + Commun.AccesseurTableNewsletter + " (" + Commun.AccesseurChampUserIdBase + "," + Commun.AccesseurChampEmailNewsletterBase + "," + Commun.AccesseurChampTopicsChosenNewsletterBase + ") Values(@" + Commun.AccesseurChampUserIdBase + ",@" + Commun.AccesseurChampEmailNewsletterBase + ",@" + Commun.AccesseurChampTopicsChosenNewsletterBase + ")", Connexion);
 
                        SqlDataAdapter1.InsertCommand.Parameters.Add("@" + Commun.AccesseurChampUserIdBase, SqlDbType.UniqueIdentifier, 50, Commun.AccesseurChampUserIdBase);
                        SqlDataAdapter1.InsertCommand.Parameters.Add("@" + Commun.AccesseurChampEmailNewsletterBase, SqlDbType.VarChar, 50, Commun.AccesseurChampEmailNewsletterBase);
                        SqlDataAdapter1.InsertCommand.Parameters.Add("@" + Commun.AccesseurChampTopicsChosenNewsletterBase, SqlDbType.VarChar, 1000, Commun.AccesseurChampTopicsChosenNewsletterBase);
                    }
                    DataRow oDataRow;
                    oDataRow = DataSet1.Tables[Commun.AccesseurTableNewsletter].NewRow();
 
                    oDataRow[Commun.AccesseurChampUserIdBase] = Membership.GetUser().ProviderUserKey;
                    oDataRow[Commun.AccesseurChampEmailNewsletterBase] = TextBoxEmail.Text;
                    oDataRow[Commun.AccesseurChampTopicsChosenNewsletterBase] = Convert.ToInt32(chkbox.Value);
 
 
                    DataSet1.Tables[Commun.AccesseurTableNewsletter].Rows.Add(oDataRow);
                    if(!(SqlDataAdapter1.DeleteCommand == null))
                    {
                        SqlDataAdapter1.DeleteCommand.Dispose();
                    }
 
                }
            }
            try
            {
                SqlDataAdapter1.Update(DataSet1, Commun.AccesseurTableNewsletter);
            }
            catch (Exception exc)
            {
 
            }
 
        }
Ca pante quand je fais ca :
1) je me connecte en tant que membres
2) je vais m'inscrire à la newsletter alors que je n'étais pas inscrit avant
3) Ca marche, les infos sont écrites en base
4) Dans la même session je reviens modifier mes infos de newsletter.. Les données précédemment inscrites sont correctement bindées.
5) je modifie mes choix.
6) Je valide et là, j'ai l'exception au niveau de l'update du InsertCommand (le DeleteCommand semble bien se passer.

OUF ! Désolé pour la longueur, mais je voulais que le max de choses y soient car je ne comprends vraiment pas cette erreur.

Merci beaucoup de vos réponses et de votre patience !!!

Nixar