Naviguer dans un reader

Résolu
MBDA Messages postés 4 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 18 mai 2009 - 7 mai 2009 à 12:02
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 - 7 mai 2009 à 16:13
Je debute dans le C# est la j'ai un gros soucis. Il est possible que la réponse existe deja sur le forum mais je n'ai pas réussi a mettre la main decu :~(  

Donc mon probleme :
Je consulte ma base de données avec un reader (une liste de clients) et j'affiche toutes les infos dans des textbox.
J'aimerai pouvoir cliquer sur un bouton "Suivant" et chaque clic permetterai d'afficher le client suivant.  
----------------------------------------
        private void cmd_consulter_Click(object sender, EventArgs e)
        {
            string requete = "Select nom_pays,code_tireur,nom,prenom,catégorie,ville,rue,nom_club,num_rue,codepostale from Pays,Tireur,Club where Tireur.club_code=Club.code_club and Club.pays_code=Pays.code_pays";

            cnx = new OdbcConnection("Driver={SQL Server};Server=BMAILLARD-WINXP\\SQLEXPRESS;Database=C36_Maillard;");
            cnx .Open ();
            cmd = new OdbcCommand(requete,cnx);
            myreader = cmd.ExecuteReader();
            myreader.Read();
           
                txt_paysconsul.Text = myreader.GetString(0);
                txt_nomconsul.Text = myreader.GetString(2);
                txt_clubconsul.Text = myreader.GetString(7);
                txt_codeconsul.Text = myreader.GetInt32(1).ToString();
                txt_catconsul.Text = myreader.GetString(4);
                txt_prenomconsul.Text = myreader.GetString(3);
                txt_rueconsul.Text = myreader.GetString(6);
                txt_villeconsul.Text = myreader.GetString(5);
                txt_numadconsul.Text = myreader.GetInt32(8).ToString();
                txt_cpconsul.Text = myreader.GetInt32(9).ToString();
                }
---------------------------

4 réponses

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
7 mai 2009 à 12:32
Salut

Si tu veux garder ton reader, attention que ça implique que ta connexion reste ouverte tout le temps, ce n'est pas très propre.
Cependant, si c'est ce que tu veux faire :

il suffit d'appeler une méthode lors du clic sur ton bouton suivant, qui commence par lire le champ suivant en faisant myreader.Read(); si ça renvoie false, c'est que c'était le dernier. Si ça ne l'est pas, tu met à jour des champs.
Cependant, avec cette méthode, il n'est pas possible de revenir en arrière.

Ces 2 méthodes sont donc plus pratiques et plus propres :
Peu d'enregistrements =>
Tu fais ta requête
Tu enregistres toutes tes données dans une List
Tu fermes ta connexion
Tu parcours ta liste

Beaucoup d'enregistrements =>
Tu parcours en faisant des requêtes à chaque fois, et donc en fermant ta connexion dès que tu as fait ta requête.

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
3
MBDA Messages postés 4 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 18 mai 2009
7 mai 2009 à 15:27
Désolé de vous avoir déranger !!!!! krimog t'es un bon ;~)

Merci bcp la solution pour les futur personne qui galere tentaient le TRY{}CATCH(){} c'est magique.
------------------------------------------------
        private void cmd_nexttireur_Click(object sender, EventArgs e)
        {
             i = i + 1;
            string requete =
"Select nom_pays,code_tireur,nom,prenom,catégorie,ville,rue,nom_club,num_rue,codepostale from Pays,Tireur,Club where Tireur.club_code=Club.code_club and Club.pays_code=Pays.code_pays and code_tireur="+i;


            try
            {

                cnx = new OdbcConnection("Driver={SQL Server};Server=srvapp;UID=" + pseudo + ";PWD=" + pasw + ";Database=C36_Maillard;");
                cnx.Open();
                cmd = new OdbcCommand(requete, cnx);
                myreader = cmd.ExecuteReader();
                myreader.Read();


                txt_paysconsul.Text = myreader.GetString(0);
                txt_nomconsul.Text = myreader.GetString(2);
                txt_clubconsul.Text = myreader.GetString(7);
                txt_codeconsul.Text = myreader.GetInt32(1).ToString();
                txt_catconsul.Text = myreader.GetString(4);
                txt_prenomconsul.Text = myreader.GetString(3);
                txt_rueconsul.Text = myreader.GetString(6);
                txt_villeconsul.Text = myreader.GetString(5);
                txt_numadconsul.Text = myreader.GetInt32(8).ToString();
                txt_cpconsul.Text = myreader.GetInt32(9).ToString();
            }
            catch
            {i = 0;
                MainForm.MessageB ("retour au debut de la liste");
             }
            }
3
MBDA Messages postés 4 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 18 mai 2009
7 mai 2009 à 13:53
J'ai mit le lien de mon programme (MEGAUPLOAD) developpé sur VS 2008 et la base de données SQL.

La form en question est "gestion" et la partie sur laquel je travail est "Consulter".

Merci de ta réponse krimog mais ca reste floue a mes yeux mais je vais tenter de l'exploiter .

Je vous invite a jeter un oeil sur ce qui a deja été fait.

Merci de votre aide
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
7 mai 2009 à 16:13
C'est parfait si ça marche.

Cependant, je souhaiterais nuancer ta remarque sur le try/catch. Il s'agit d'un mécanisme de gestion d'erreurs. Cependant, certaines erreurs peuvent être évitées sans.
Dans ton cas, par exemple, l'erreur est générée par la première ligne lisant le reader (myreader.GetString(0)) si le reader n'a plus d'éléments. Mais si tu avais fait :
if (myreader.Read())
{
    txt_paysconsul.Text = myreader.GetString(0);
    //...
}else{
    i = 0;
    MainForm.MessageB("Retour au début de la liste");
}
ça aurait marché aussi bien et ton programme aurait été plus compréhensible (selon moi en tout cas). Tu pouvais cependant laisser ton try/catch au cas où le programme n'arrivait pas à ouvrir la connexion.

Autre petite remarque : n'oublie surtout pas de fermer ta connexion. Pour être sûr de la fermer si elle est ouverte, utilise un bloc try/catch/finally :
try
{
    // Ouvre ta connexion et fait tes machins
}
catch (Exception e)
{
    // Message d'erreur, tout ça...
}
finally
{
    if (cnx.State == ConnectionState.Open) cnx.Close();
}

Dernière remarque : en SQL, les produits carthésiens (FROM Table1, Table2) sont extrêmement lents. En faisant ça, il va traiter une table avec un nombre ligne égal à la multiplication du nombre de lignes de chaque table (si tes 3 tables contiennent 100 enregistrements, il va traiter une table d'un million de lignes ^^), puis faire un filtre. Les jointures sont bien mieux pour ça :SELECT * FROM Table1 t1 INNER JOIN Table2 t2 ON t1.IdT2 t2.Id INNER JOIN Table3 t3 ON t3.IdT2 t2.Id WHERE t1.MonTruc = bidule;
(Je sais, ça semble plus compliqué, et c'est plus long à taper, mais c'est beaucoup plus efficace)

Voilà, il s'agit juste de petites remarques pour améliorer ton code, même s'il marche déjà.

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
0
Rejoignez-nous