IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

MYSQL - Récupération données


Sujet :

C

  1. #1
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut MYSQL - Récupération données
    Voila j'ai crée un programme afin de récupérer des données d'une base de données. Or j'ai un soucis dans mon code baseDeDonnes.c avec la récupération du résultat.

    J'ai trouvé des fonctions mais je ne les comprends pas, pourriez-vous me les expliquer ?


    ma structure de donnée s_resultat est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct resultat
    {
        int insee;
        char  nom[30];
        double latitude;
        double longitude;
        int cp;
    }s_resultat;
    Mon fichier code source
    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
     
    // Fonction permettant de récuprer les resultats de la requete et de les    stocker dans un tableau
     
    s_resultat* recuperationInformations(s_resultat *tab, MYSQL *mysql){
     
         //Déclaration des pointeurs de structure
         MYSQL_RES *result = NULL;
         MYSQL_ROW row = NULL;       
         int i,cpt,nb, num_champs = 0; 
     
          //Requête qui sélectionne tout dans ma table scores
          mysql_query(mysql, "SELECT * FROM ville");
          printf("Requete effectuee ! \n");
     
          result = mysql_store_result(mysql);
     
          nb = mysql_num_rows(result);             
     
          // tablo  dynamique du resultat
     
          do{
              tab=(s_resultat*)malloc(nb * sizeof(s_resultat));
              cpt ++; 
     
              }while(tab==NULL && cpt==3);                                                                                   
     
          //On récupère le nombre de champs
          num_champs = mysql_num_fields(result);
     
           //Structure temporaire
           s_resultat temp;
     
     
          //Tant qu'il y a un résultat
           while ((row = mysql_fetch_row(result))) {
     
     
         // CREATION STRUCTURE TEMPORAIRE
     
           temp.insee = strtoul(row[0]?row[0]:"0", NULL, 10);
           //temp.insee = strtoul(row[0], NULL, 10);
     
     
           strcpy(temp.nom,row[1]?row[1]:"");
           //printf("%s",row[1]) ;
     
     
           temp.latitude = strtod(row[2]?row[2] : "0",NULL );
     
     
           temp.longitude = atof(row[3]?row[3] : "0" );
     
           temp.cp = strtoul(row[4]?row[4] : "0", NULL, 10 );                                     
     
          // INSERTION DANS UN TABLEAU DYNAMIQUE
           *(tab+i) = temp;
     
          i++;
     
           }
     
                //Libération du jeu de résultat
              //  mysql_free_result(result);            
              //  for(int i=0; i<nb; i++) free(tab+i);
     
              //  free(tab);
     
                //Fermeture de MySQL
                //mysql_close(&mysql);
                //system("pause");
                return tab;
    }
    Je ne comprends donc pas les fonctions :
    temp.insee = strtoul(row[0]?row[0]:"0", NULL, 10);
    strcpy(temp.nom,row[1]?row[1]:"");
    temp.latitude = strtod(row[2]?row[2] : "0",NULL );
    temp.longitude = atof(row[3]?row[3] : "0" );
    temp.cp = strtoul(row[4]?row[4] : "0", NULL, 10 );

    Est-ce véritablement les fonctions à utiliser ? J'en ai mis d'autre en commentaire quelle est la différence ? Merci de m'éclairer.

    J'ai également un autre soucis avec mon insertion dans le tableau dynamique, je ne comprends pas le problème. Mon programme s'execute mais plante à l'execution de cette commande. Quel est le problème selon vous ?

    Ensuite ma table mysql a été déclaré avec des doubles(9,9) et dans mon programme C je n'arrive pas à récupérer la totalité de la variable, elle est tronqué comment est ce possible ?


    Merci d'avance

  2. #2
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 16
    Par défaut
    Je ne comprends donc pas les fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    temp.insee = strtoul(row[0]?row[0]:"0", NULL, 10);
    strcpy(temp.nom,row[1]?row[1]:"");
    temp.latitude = strtod(row[2]?row[2] : "0",NULL );
    temp.longitude = atof(row[3]?row[3] : "0" );
    temp.cp = strtoul(row[4]?row[4] : "0", NULL, 10 );
    Je pense que ce que tu ne comprends pas, ce n'est pas les fonctions en elles-meme mais les operateurs ternaires qui sont utilises en parametres.

    grosso modo, l'operateur ?: revient a un branchement if else

    on pourrai ecrire pour le premier cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (row[0] == NULL)
       temp.insee = strtoul("0", NULL, 10);
    else
       temp.insee = strtoul(row[0], NULL, 10);
    ici, l'operateur est utilise pour tester le contenu de ton tableau et eviter le
    segfault qui ne m'emquerai pas d'arriver dans ton code sans cela.


    Pour ta question sur le plantage de ton programme, il y a plein de raison pour lequels ca peut planter, mais je ne suis pas sur de comprendre ta demarche dans certaines partie de ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          do{
              tab=(s_resultat*)malloc(nb * sizeof(s_resultat));
              cpt ++; 
     
              }while(tab==NULL && cpt==3);
    pour quel raison fais tu une boucle, si ton malloc echoue, c'est qu'il n'y a plus de memoire disponible et il est fort peu probable que en 3 iterations, il y en ai qui se soit libere.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     int i,cpt,nb, num_champs = 0;
    ici, tu n'initialise a 0 que ta variable num_champs, pas les autres.
    il te faut toutes les faire.

    ensuite tu n'as pas de marqueur de fin de tableau de prevu, donc a l'execution tu ne peux pas savoir quand t'arreter lors du parcours de celui-ci.
    une solution serais de passer une variable supplementaire contenant la taille du tableau.

    et puis tu utilises une variable temporaire pour remplir ton tableau ce qui est totalement inutile, tu aurais pu ecrire directement
    pour affecter la valeur a l'element courant de ton tableau


    pour ta derniere question, je n'ai pas de reponse comme ca, je n'ai jamais utilise les lib mysql en C, mais est-tu sur que tu utilise les bonnes fonctions pour recuperer tes doubles ?
    dans ton code tu en as utilise deux differentes atof et strtod, je pense que dans les docs de la lib il doit y avoir ecrit celle que tu dois prendre

  3. #3
    Membre confirmé Avatar de nicodn02
    Profil pro
    Consultant .NET
    Inscrit en
    Mars 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant .NET

    Informations forums :
    Inscription : Mars 2007
    Messages : 263
    Par défaut
    Merci pour tes explications.

    Pour les résultats de la requete comment dois je faire ? Je dois vérifier si le champs est bien ce que j'attends ( c'est à dire que ce soit bien un entier ou un char) et enuite j'applique la méthode appropriée ?

    De plus, quelqu'un serait comment mettre en place une gestion des erreurs mysql. J'avais pensé créer un fichier erreur.c avec la liste des erreurs mysql mais après je ne vois pas comment organiser mon code... Car la finalité de cette idée est de créer un fichier de compte rendu d'execution de mon programme. Je pourrais ainsi voir les anomalies mysql.

Discussions similaires

  1. [Flash - MySQL] Récupération de données
    Par DiMa2gio dans le forum Flash
    Réponses: 2
    Dernier message: 11/04/2011, 09h02
  2. Surveillance et récupération donnée mysql
    Par Kev9723 dans le forum MySQL
    Réponses: 1
    Dernier message: 03/09/2010, 16h51
  3. [MySQL] Récupération données MySQL dans un tableau
    Par joebiloute202 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 20/08/2008, 12h09
  4. [SimpleXML] Récupération données de XML vers une table MySQL
    Par emmma dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 29/06/2007, 18h28
  5. [FLASH 8] Récupération données depuis MySQL
    Par coulb dans le forum Flash
    Réponses: 3
    Dernier message: 31/03/2007, 00h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo