Alimenter combobox selon selection d'une autre combobox via ODBC MySQL

cs_bacio Messages postés 13 Date d'inscription lundi 25 décembre 2000 Statut Membre Dernière intervention 19 février 2009 - 16 févr. 2009 à 11:49
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 - 17 févr. 2009 à 00:55
Bonjour, je n'arrive pas a réaliser une chose surement simple vu que je débute.
Je vous explique :

J'ai ce MLD (en simplifié) :

PARTICIPANT (id_participant, nom, prenom);

FOIRE (année, lib_foire);

INSCRIPTION_FOIRE (#année, num_inscription, date_inscription, #id_participant);

SALON (#année, id_salon, des_salon);

INSCRIPTION_SALON( #id_salon, num_inscription2, date_inscription, #id_participant);

J'ai cette interface : http://img22.imageshack.us/my.php?image=interfacexv6.jpg

Je souhaite que dans cb_selectfoire s'affiche les années de FOIRE et que cb_selectsalon s'affiche la liste des salons (des_salon) en fonction de l'année de la foire, MAIS aussi un "Tout afficher".

dans dgv_afficher_part_inscrit il doit y avoir la liste des participants par salon selectionner dans cb_selectsalon, ou tous si "Tout afficher" est selectionné.

voici mon code : dans sqlFoire.cs

/ FONCTION FOIRE
       public static dsFoire getFoire()
             {
                 dsFoire ds = new dsFoire();
                 try
                 {
                     dsFoireTableAdapters.ta_foire dtMesFoires = new foire_de_vienne.dsFoireTableAdapters.ta_foire();
                     dtMesFoires.FillFoire(ds.dt_foire);
                 }
                 catch (DbException)
                 {
                     ds = null;
                 }
                 return ds;
             }

------------------------------------------------------------------------------

dans FormMenu.cs

//chargement de la combobox cb_selectfoire
            dsFoire myDsFoire2 = foire_de_vienne.sqlFoire.getFoire();
            cb_selectfoire.DataSource = myDsFoire2.dt_foire;
            cb_selectfoire.DisplayMember = "annee";

private void FormMenu_Load(object sender, EventArgs e)
        {
            int year = Convert.ToInt32(cb_selectfoire.SelectedItem);

            //requete à exécuter            string requete "SELECT id_salon FROM SALON WHERE annee"+ year;

            //création de la connection
            OdbcConnection connection = new OdbcConnection();

            //chaine de connection (du type "DSN=monDSN)
            string chaineDeConnection = "Dsn=dsn_foire_de_vienne;database=foire_de_vienne;option=0;port=0;server=localhost;uid=root";

            //affectation de la chaine de connection à la connection
            connection.ConnectionString = chaineDeConnection;

            //ouverture de la connection
            connection.Open();

            //création du DataSet
            DataSet data = new DataSet();

            //création du OdbcDataAdapter
            OdbcDataAdapter adapter = new OdbcDataAdapter(requete, connection);

            //remplissage du DataSet avec les résultats de la requête
            adapter.Fill(data);

            //on déclare maTable comme étant la première table du DataSet (celle qui nous interesse)
            DataTable maTable = data.Tables[0];

            foreach (DataRow row in maTable.Rows)
            {
                cb_selectsalon.Text += row[0] + "\r\n";
            }

C'est beaucoup demandé mais si vous pouviez m'aider, merci d'avance.

Cordialement, bacio

7 réponses

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
16 févr. 2009 à 14:54
Salut.
Je suis très perplexe quant à "
cb_selectsalon.Text += row[0] + "\r\n";
". Je ne sais pas si ça fonctionne, mais dans tous les cas, il me semble bien plus efficace et plus simple d'utiliser "
cb_selectsalon.Items.Add(row[0]);
".
Et si tu veux un champ "Tout afficher", tu insère tout simplement un champ du même nom avant les autres : "
cb_selectsalon.Items.Add("Tout afficher");
" puis, sur le
SelectedIndexChanged
de ta combobox, tu regardes juste si "
cb_selectsalon.SelectedIndex == 0
" ou pas. Si c'est le cas, tu fais ta requête sur tout, sinon tu la fais sur "
cb_selectsalon.SelectedValue as string
".






Krimog :
while (!succeed = try()) ;
0
cs_bacio Messages postés 13 Date d'inscription lundi 25 décembre 2000 Statut Membre Dernière intervention 19 février 2009
16 févr. 2009 à 15:35
merci pour ton message en effet tu as raison je penses que c'est bien mieux, malheureusement maintenant j'ai droit a un "Unknown column 'System.Data.DataRowView' in 'where clause'" sur la ligne "adapter.Fill(data);" pourtant ma requète est juste :O
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
16 févr. 2009 à 16:01
Une erreur sur un adapter.Fill() vient d'une erreur dans la requête (car c'est à ce moment qu'elle est exécutée).

Cette erreur indique 2 choses (La première sûre, la deuxième, ça dépend) :
- "System.Data.DataRowView" => Quand on fait un .ToString() sur un object qui n'a pas de valeur simple, il renvoie le type d'objet dont il s'agit. C'est ce qu'il semble s'être passé dans ton cas. Tu as peut-être oublié un .Value, un .Text ou encore un [0]. (Je ne peux pas vraiment te dire, je ne connais vraiment pas la classe DataRowView.
ET
- "Unknown column" => MySQL a considéré ton texte comme un nom de colone et non un string tout simplement parce que tu n'a pas mis d'apostrophe autour. Cependant, s'il est censé s'agir d'une valeur numérique, il faut effectivement ne pas mettre d'apostrophe. Mais là c'est toi qui connais ton code.
          ça doit ressembler à l'un des deux exemples en dessous :          requete "SELECT * FROM MaTable WHERE monTexte '"+texte"'";          requete "SELECT * FROM MaTable WHERE monNombre "+monNombre;






Krimog :
while (!succeed = try()) ;
0
cs_bacio Messages postés 13 Date d'inscription lundi 25 décembre 2000 Statut Membre Dernière intervention 19 février 2009
16 févr. 2009 à 16:34
Dans ma base de donnée "annee" est de type YEAR, c'est a dire juste les 4 chiffres de l'année : 2007, 2008 etc..

Dans mon dataset Visual me le met en Int32.

je l'ai changé en String et sa me marche toujours pas..

J'ai essayer comme sa avec les ' '

string year = cb_selectfoire.Text;

//requete à exécuter
string requete "SELECT * FROM SALON WHERE annee'"+year"'";


et aussi

string requete "SELECT * FROM SALON WHERE annee"+year;

rien n'y fait toujours la même erreur :(

Merci pour tes explications en tout cas j'ai beaucoup appris!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
16 févr. 2009 à 17:39
Si tu affiches cb_selectfoire.Text, tu verras que justement, ce n'est probablement pas un string ni un int. C'est de là que vient l'erreur.

Entre utiliser un string ou un int year, autant utiliser un string puisque dans tous les cas tu reconvertirait ton int en string lors de ta requête (tout simplement car ta requête n'est autre qu'un string)

Donc au final :

string year = cb_selectfoire.SelectedItem as string; // Là tu récupères le texte sélectionné

et après, tu fais ta requete avec ou sans les apostrophes selon que dans ta base de données, il considère ça comme un int ou un varchar (ça peut même peut-être marcher avec les 2).

Et un petit conseil : le débugger de Visual Studio est vraiment génial. Si tu veux voir une valeur à un moment précis, tu mets un point d'arrêt à la ligne en question (en cliquant à gauche de ton code, ça fait un point rouge). Le programme se mettera en pause AVANT l'exécution de la ligne, et tu pourras mettre ta souris sur tes variables pour voir leurs valeurs et propriétés. (Clique sur la flèche de lecture pour reprendre l'exécution de ton programme après).

En l'occurrence, tu aurais vu qu'au moment ou tu fais "string year = cb_selectfoire.Text;
", year n'a pas la bonne valeur. Enfin, c'est uniquement si, comme je le pense, l'erreur vient de là.

Krimog :
while (!succeed = try()) ;
0
cs_bacio Messages postés 13 Date d'inscription lundi 25 décembre 2000 Statut Membre Dernière intervention 19 février 2009
16 févr. 2009 à 20:14
Merci beaucoup, je n'ai plus aucune erreur mais rien de s'affiche dans ma cb_selectsalon :s
c'est compliqué quand meme :D je vais continuer de fouiller les forums, mais la je bloque vraiment :s

merci vraiment de ton aide en tout cas!
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
17 févr. 2009 à 00:55
Tu devrais récupérer la valeur de ta requête, et la coller dans PhpMyAdmin (si tu as). Comme ça, tu verras si le problème vient de ta requête ou du traitement derrière.

Krimog :
while (!succeed = try()) ;
0
Rejoignez-nous