Foreach insert into

Signaler
-
 boule118 -
Bonjour à tous
Je débute mon apprentissage en programmation et voilà mon problème
je développe en c#
J'ai une interface avec une checklistbox avec des noms villes et une simple listbox avec les noms de produits et des textbox avec les quantités de produits commandés
j'ai aussi une base de donnée avec entre autres 2 tables (commande et lignes de commande)
j'essai d'écrire des requêtes qui me rajoute une ligne dans la table commande et autant de ligne que j'ai de noms de villes cochés dans ma checklistbox.

  private void btn_Voir_La_Cmd_Click(object sender, EventArgs e)
        {
            OleDbConnection cn = new OleDbConnection();
            cn.ConnectionString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Sebastien\Documents\afficahge\afficahge\musicalsol.accdb;Persist Security Info=True;Jet OLEDB:Database Password=Admin");
            cn.Open();
            if (txtA3.Text !="")
            {
                listaffiches.SelectedItems.Add(0);//Pour selectionner l'item correspondant a la textbox (ça marche pas)
            }

 try
            {
 OleDbCommand cmd = new OleDbCommand();

                cmd.Connection = cn;

                cmd.CommandText = "insert into commandes (num_commande,date_de_commande,nom_adherent,montant) values('" + int.Parse(txtNumCmd.Text) + "','" +Convert.ToDateTime(txtDate.Text) + "','" +comboAdherent.SelectedItem+"','"+txtTotal.Text.ToString()+"')";
                cmd.ExecuteNonQuery();

foreach (string Item in checkedListVallelAude.CheckedItems)
                    {
                        
                        cmd.CommandText = "insert into lignes_de_commande ( num_commande,reference,commune) values('" + int.Parse(txtNumCmd.Text) + "','" + listaffiches.SelectedItems + "','" + checkedListVallelAude.SelectedItem + "')";
                    
                        cmd.ExecuteNonQuery();
 }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
                        
                    }


Ce code me renvoi l'erreur suivante sur la 2ème requete "La liste à laquelle cet énumérateur est lié a été modifié.Un énumerateur ne peut être utilisé que si la liste ne change pas".
Quelqu’un peut t-il m'aider à résoudre mon mes erreurs car à mes yeux la liste n'est pas modifier. et l'item devrait être sélectionné
Merci d'avance
Seb

6 réponses

Messages postés
14464
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 juillet 2020
420
Bonjour,

à première vue, tu fais un foreach avec item comme enumérateur, mais tu ne t'en sers pas.

En plus ta commande
cmd.CommandText = "insert into lignes_de_commande ( num_commande,reference,commune) values('" + int.Parse(txtNumCmd.Text) + "','" + listaffiches.SelectedItems + "','" + checkedListVallelAude.SelectedItem + "')";

fait apparaitre listaffiches.SelectedItemS, ça ne je pense pas que ça te sorte un string utile.

Whismeril
Merci pour ta réponse
j'ai refais le foreach de cette façon
 foreach (object itemChecked in checkedListVallelAude.CheckedItems)
                    {

                        cmd.CommandText = "insert into lignes_de_commande ( num_commande,reference,commune) values('" + int.Parse(txtNumCmd.Text) + "','" + listaffiches.SelectedItem + "','" + checkedListVallelAude.CheckedItems.ToString() + "')";
                    
                        cmd.ExecuteNonQuery();
                        
                    }

On dirait qu'il y a du mieux mais dans ma base de donnée a la place du nom de la ville j'ai ça qui s'affiche "System.Windows.Forms.CheckedListBox+CheckedItemCollection"
Messages postés
14464
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 juillet 2020
420
Bonjour, oui c'est ce que je voulais te dire, il faut que tu extrais l'item correspondant que tu le cast pour accéder à sa valeur.
Je n'ai pas VS sous la main mais certains contrôles ont une propriété selectedtext qui te serait peut être plus utile

Whismeril
foreach (string Item in checkedListVallelAude.CheckedItems)
                {

                    cmd.CommandText = "insert into lignes_de_commande ( num_commande,reference,commune) values(" + int.Parse(txtNumCmd.Text) + ",'" + listaffiches.SelectedItem + "','" + Item + "')";

                    cmd.ExecuteNonQuery();

ça marche presque
depuis ce matin je cherche, au passage du premier foreach le champs commune ce rempli avec TOUS les Item du checkbox si je choisi de cocher le 1er item de la liste.
Et au 2ème passage c'est bon il prend bien le bon item.
Si je ne choisi pas la première commune de la liste ça a l'air de marcher.

Je pense qu'il y a un détail qui m'échappe dans l'usage du foreach ? qu'en penses tu ?
Messages postés
14464
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 juillet 2020
420
Je suis surpris de ce code
string Item in checkedListVallelAude.CheckedItems

CheckedItems n'est pas (il me semble) une collection de string donc le fait que tu forces item a être un string est peut être l'origine de ton bug.
Je n'ai pas VS sous la main pour essayer.

Whismeril
foreach (string Item in checkedListVallelAude.CheckedItems)
                {

                    cmd.CommandText = "insert into lignes_de_commande ( num_commande,reference,commune) values(" + int.Parse(txtNumCmd.Text) + ",'" + listaffiches.SelectedItem + "','" + Item + "')";

                    cmd.ExecuteNonQuery();

                }

Merci pour ton aide et le temps passé. Je pense avoir réglé le problème(pour le moment) de cette façon