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

Windows Discussion :

API MYQSL erreur de compilation


Sujet :

Windows

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 66
    Points : 39
    Points
    39
    Par défaut API MYQSL erreur de compilation
    Bonjour,

    Voila mon souci je cherche a réaliser un connexion a une base de données mysql.
    en suivant le tutoriel qui se trouve ici

    mais malheureusement je me retrouve avec une erreur de compilation, et je comprend pas pourquoi.

    Voici mon 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
    #include <winsock2.h>    	/*socket*/
    #include <stdio.h>      	/*printf*/
    #include <MYSQL/mysql.h>
    #define __WIN__
    
    
    #pragma comment(lib, "ws2_32.lib")
    
    int main()
    {
    
    	
     printf ("code appli:%s type serveur : %s\n",code_appli,type_serveur);
    //Déclaration du pointeur de structure de type MYSQL
        MYSQL mysql;
            //Initialisation de MySQL
            mysql_init(&mysql);
            //Options de connexion
            mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"option");
    
            //Si la connexion réussie...
            if(mysql_real_connect(&mysql,"localhost","thanks","thanks","atos",0,NULL,0))
            {
                //Requête qui sélectionne tout dans ma table scores
                mysql_query(&mysql, "SELECT * FROM historique");
    
                //Déclaration des pointeurs de structure
                MYSQL_RES *result = NULL;
                MYSQL_ROW *row = NULL;
    
                unsigned int i = 0;
                unsigned int num_champs = 0;
    
                //On met le jeu de résultat dans le pointeur result (maintenant on utilise mysql_store_result
                result = mysql_store_result(&mysql);
    
                //On récupère le nombre de champs
                num_champs = mysql_num_fields(result);
    
                //Tant qu'il y a encore un résultat ...
                while ((row = mysql_fetch_row(result)))
                {
                    //On déclare un pointeur long non signé pour y stocker la taille des valeurs
                    unsigned long *lengths;
    
                    //On stocke cette taille dans le pointeur
                    lengths = mysql_fetch_lengths(result);
    
                    //On fait une boucle pour avoir la valeur de chaque champs
                   for(i = 0; i < num_champs; i++)
                   {
                       //On ecrit toutes les valeurs
                       printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL");
                   }
                   printf("\n");
                }
    
                //Libération du jeu de résultat
                mysql_free_result(result);
    
                //Fermeture de MySQL
                mysql_close(&mysql);
    
            }
            else  //Sinon ...
            {
                printf("Une erreur s'est produite lors de la connexion à la BDD!");
            }
    }
    }



    voici les erreurs :

    - ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((row = mysql_fetch_row(result)))
    erreur:

    cannot convert 'char**' to 'char***'in assignment



    - ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL");

    erreur:

    conditionnal expresion bewtewn distinc pointer type 'char**'and 'const char*' lacks a cast


    Cordialement

  2. #2
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Voici le prototype de mysql_fetch_row()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
    et voici comment tu déclares row censé accueillir le valeur retournée par mysql_fetch_row()
    Je pense que tu as compris le problème.
    Cordialement.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    +1 pour nico !

    Si non pour ton printf, c'est bizare, je croyais que %.* ca servait a reprendre la précision précédente.... deplus tu as un argu en trop ou un %s en moins non ?

    bon courage

  4. #4
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par molox Voir le message
    Si non pour ton printf, c'est bizare, je croyais que %.* ca servait a reprendre la précision précédente.... deplus tu as un argu en trop ou un %s en moins non ?
    non le printf() est bon dans la mesure où il déclare correctement sa variable row.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Salut,

    Nico, Peux tu me préciser ce point sur le printf, il y'a quelque chose que je ne comprend pas :

    printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL");
    Je vois :

    1er argu : lengths[i]
    2nd argu : row[i] ou "NULL"

    par contre je ne vois que 1 seul %s dans le format du printtf
    un "%.*s".

    Je croyais que ".*" n'etait la que pour prendre la précision du précédent format du précédent printf

    Disont qu'il me semble qu'il manque un %s ou il y'a un argument en trop, peux tu me dire ou je me trompe ?

    Molox

  6. #6
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par norme C99
    5 As noted above,a field width, or precision, or both, may be indicated by an asterisk. In
    this case, an int argument supplies the field width or precision. The arguments
    specifying field width, or precision, or both, shall appear (in that order) before the
    argument (if any) to be converted. A negative field width argument is taken as a - flag
    followed by a positive field width. A negative precision argument is taken as if the
    precision were omitted.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    compris
    merci

  8. #8
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 66
    Points : 39
    Points
    39
    Par défaut
    bonjour, merci a tous pour vos réponse, sa compile.

    mais j'ai un nouveau problème


    ors que j'envoie les variables :type_serveur,code_appli

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (mysql_query(conn, "SELECT C.IP_SERVEUR FROM comporter C  INNER JOIN serveur S ON ((C.IP_SERVEUR = S.IP_SERVEUR AND  S.TYPE_SERVEUR = type_serveur) AND C.CODE_APPLICATION = code_appli)"))
    le programme ne l'ai prend pas en compte

    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
    95
    96
    97
    98
    	
    #include <winsock2.h>    	/*socket*/
    #include <stdio.h>      	/*printf*/
    #include <MYSQL/mysql.h>
    #define __WIN__
    
    
    #pragma comment(lib, "ws2_32.lib")
    
    int main()
    {
    
    	WSADATA WSAData;
    	WSAStartup(MAKEWORD(2,0), &WSAData);
    
    	SOCKET sock;
    	SOCKET csock;
    	SOCKADDR_IN sin;
    	SOCKADDR_IN csin;
    	char buffer[BUFSIZ];;
    	sin.sin_addr.s_addr = htonl(INADDR_ANY);
    	sin.sin_family      = AF_INET;
    	sin.sin_port        = htons(10000);
    	sock = socket(AF_INET,SOCK_STREAM,0);
    	bind(sock, (SOCKADDR *)&sin, sizeof(sin));
    
    	listen(sock,0);
    
    
    	while(1) 
        {
                 /* connection socket */
    	int sinsize = sizeof(csin);
    	csock = accept(sock, (SOCKADDR *)&csin, &sinsize);
       memset(buffer, '\0', sizeof(buffer)); /*on vide le buffer*/
       recv(csock, buffer, sizeof(buffer), 0);
         char *pointeur;
     char *separateur = { "-" }; // Le séparateur
    char *code_appli= NULL;
    char *type_serveur= NULL;
    // premier appel,
     pointeur = strtok( buffer, separateur );
     code_appli = ("%s",pointeur);
    
     while( pointeur != NULL )
     {
     // Cherche les autres separateur
     pointeur = strtok( NULL, separateur );
     if ( pointeur != NULL )
     {
          
      type_serveur = ("%s",pointeur);
    
     }
     } 
     //printf ("code appli: %s type serveur : %s\n",code_appli,type_serveur);
       MYSQL *conn;
    
       MYSQL_RES *res;
    
       MYSQL_ROW row;
    
       char *server = "localhost";
       char *user = "thanks";
       char *password = "thanks";
       char *database = "atos";
       
       conn = mysql_init(NULL);
       
       /* Connect to database */
       if (!mysql_real_connect(conn, server,
             user, password, database, 0, NULL, 0)) {
          fprintf(stderr, "%s\n", mysql_error(conn));
          return(0);
       }
       
       if (mysql_query(conn, "SELECT C.IP_SERVEUR FROM comporter C  INNER JOIN serveur S ON ((C.IP_SERVEUR = S.IP_SERVEUR AND  S.TYPE_SERVEUR = type_serveur) AND C.CODE_APPLICATION = code_appli)")) 
       {
          fprintf(stderr, "%s\n", mysql_error(conn));
          system ("pause");
          return(0);
       }
       res = mysql_use_result(conn);
       
       while ((row = mysql_fetch_row(res)) != NULL)
       {
          
         // printf ("code appli: |%s| type serveur : |%s|\n",code_appli,type_serveur);
          char *result = row[0];
          
          printf("%s \n",result);
          
       }
       /* Release memory used to store results and close connection */
       mysql_free_result(res);
       mysql_close(conn);
    }
    }
    le programme compile, mais voici ce qu'il m'affiche.


    Erreur :Unknown column 'code_appli' in 'on clause'

    Pouvez-vous m'aider s'il vous plait
    Cordialement

  9. #9
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    bas oui, depuis quand le C remplace les variables automatiquement?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (mysql_query(conn, "SELECT C.IP_SERVEUR FROM comporter C  INNER JOIN serveur S ON ((C.IP_SERVEUR = S.IP_SERVEUR AND  S.TYPE_SERVEUR = type_serveur) AND C.CODE_APPLICATION = code_appli)"))
    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
    char * command = NULL;
    asprintf(&command, "SELECT C.IP_SERVEUR FROM comporter C  "
                       "INNER JOIN serveur S ON "
                       "((C.IP_SERVEUR = S.IP_SERVEUR AND  S.TYPE_SERVEUR = %s) "
                       "AND C.CODE_APPLICATION = %s)",
                       type_serveur, code_appli);
    
    if(command != NULL)
    {
       if (mysql_query(conn, command))
       {
          ...
       }
    
       free(command), command = NULL;
    }

  10. #10
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 66
    Points : 39
    Points
    39
    Par défaut
    Merci de ton aide.

    J'ai testé le code que tu m'a donné en modifiant le mien.

    Mais cella ne compile pas.

    Voici les erreurs :

    initialization makes pointerfrom integer without the cast

    sur la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char * command = asprintf("SELECT C.IP_SERVEUR FROM comporter C  "
                              "INNER JOIN serveur S ON "
                              "((C.IP_SERVEUR = S.IP_SERVEUR AND  S.TYPE_SERVEUR = %s) "
                              "AND C.CODE_APPLICATION = %s)",type_serveur, code_appli);

    Puis la seconde erreur : link erreur asprintf
    Mais il doit juste me manquer un include



    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
    char * command = asprintf("SELECT C.IP_SERVEUR FROM comporter C  "
                              "INNER JOIN serveur S ON "
                              "((C.IP_SERVEUR = S.IP_SERVEUR AND  S.TYPE_SERVEUR = %s) "
                              "AND C.CODE_APPLICATION = %s)",type_serveur, code_appli);
    
    if(command != NULL)
    {
       if (mysql_query(conn, command))
       {
          fprintf(stderr, "%s\n", mysql_error(conn));
          system ("pause");
          return(0);
       }
    res = mysql_use_result(conn);
       
       while ((row = mysql_fetch_row(res)) != NULL)
       {
          
         // printf ("code appli: |%s| type serveur : |%s|\n",code_appli,type_serveur);
          char *result = row[0];
          
          printf("%s \n",result);
          
       }
       /* Release memory used to store results and close connection */
       mysql_free_result(res);
       mysql_close(conn);
       free(command), command = NULL;
    }

    Cordialement

  11. #11
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    mea culpa, c'est une fonction linux, en plus je l'utilisais mal, je ne connais pas l'équivalent sous Windows, Médinoc doit surement en connaître un.
    Le truc c'est d'allouer sur le tas la taille suffisante pour la chaine finale et de formatter correctement sa chaine.

  12. #12
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 66
    Points : 39
    Points
    39
    Par défaut
    j'ai trouvé la solution

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    sprintf(sql_query, "SELECT C.IP_SERVEUR FROM comporter C "
                       " INNER JOIN serveur S ON "
                       " ((C.IP_SERVEUR = S.IP_SERVEUR AND  S.TYPE_SERVEUR = '%s') "
                       " AND C.CODE_APPLICATION = '%s')",
                       type_serveur, code_appli);
    
    
       if (mysql_query(conn, sql_query))
       {
          fprintf(stderr, "%s\n", mysql_error(conn));
          system ("pause");
          return(0);
       }
    Merci de ton aide, sa m'a débloqué

    Cordialement

  13. #13
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par thanks33 Voir le message
    j'ai trouvé la solution

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    sprintf(sql_query, "SELECT C.IP_SERVEUR FROM comporter C "
                       " INNER JOIN serveur S ON "
                       " ((C.IP_SERVEUR = S.IP_SERVEUR AND  S.TYPE_SERVEUR = '%s') "
                       " AND C.CODE_APPLICATION = '%s')",
                       type_serveur, code_appli);
    
    
       if (mysql_query(conn, sql_query))
       {
          fprintf(stderr, "%s\n", mysql_error(conn));
          system ("pause");
          return(0);
       }
    Merci de ton aide, sa m'a débloqué

    Cordialement
    Ok, mais pitié, retire les fonctions sprintf() et system(), ceux sont des aberrations...

  14. #14
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 66
    Points : 39
    Points
    39
    Par défaut
    Merci du conseille, j'ai viré sprintf et le system() me servais pour le debug

    Cordialement

  15. #15
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par thanks33 Voir le message
    Merci du conseille, j'ai viré sprintf et le system() me servais pour le debug

    Cordialement
    oui, le sprintf() peut être remplacer par snprintf() ou plus évolué, quand au system("pause"), une simple getchar() fera l'affaire.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur de compilation API windows
    Par MarioNoFearS dans le forum Windows
    Réponses: 2
    Dernier message: 02/06/2007, 09h40
  2. Réponses: 6
    Dernier message: 28/03/2007, 20h40
  3. API windows erreur a la compilation du projet
    Par JoneZy dans le forum Windows
    Réponses: 3
    Dernier message: 26/12/2006, 00h38
  4. API c/Mysql : erreur de compilation
    Par jamalmoundir dans le forum C
    Réponses: 11
    Dernier message: 22/05/2006, 12h46
  5. Api mysql avec Devc++, erreur de compilation
    Par Viiince dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 15/06/2004, 18h19

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