Exemple de test de connection au Mysql ne marche pas dans un programme C

boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 - 1 juil. 2009 à 09:41
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 - 8 juil. 2009 à 11:08
Salut,

j'ai installé la librairie mysql.
- Je voudrais établir dans mon programme C une connexion à une base de données crée sous Mysql(j'ai instalé EasyPHP-3.0-setup). Sachant que mon programme C est sous Visual Studio 2008.

- La vesion de mysql est 5.1.30.
- J'ai écrit un petit exemple de test. mais j'ai eu des erreurs.

Voici mon code:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <libxml/parser.h>
#include <winsock.h>
#include <mysql.h>
#pragma comment(lib,"libxml2.lib")
//#pragma comment (lib,"libmysql.lib")

int main() {
    xmlDocPtr doc;
    xmlNodePtr racine;
    MYSQL mysql;
    mysql_init(&mysql);
    mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"option");

    // Ouverture du fichier XML
    doc = xmlParseFile("catalogue.xml");
    if (doc == NULL) {
        fprintf(stderr, "Document XML invalide\n");
        return EXIT_FAILURE;
    }
    // Récupération de la racine
    racine = xmlDocGetRootElement(doc);
    if (racine == NULL) {
        fprintf(stderr, "Document XML vierge\n");
        xmlFreeDoc(doc);
        return EXIT_FAILURE;
    }
    printf("La racine du document est : %s\n", racine->name);
    // Libération de la mémoire
    xmlFreeDoc(doc);

    return EXIT_SUCCESS;
    

    
    if(mysql_real_connect(&mysql,"localhost","root","","chmsi",0,NULL,0))
    {
        mysql_close(&mysql);
    }
    else
    {
        printf("Une erreur s'est produite lors de la connexion à la BDD!");
    }

    
}

message d'erreur:

1>------ Début de la génération : Projet : passage, Configuration : Debug Win32 ------
1>Compilation en cours...
1>main.c
1>Édition des liens en cours...
1>main.obj : error LNK2019: symbole externe non résolu _mysql_close@4 référencé dans la fonction _main
1>main.obj : error LNK2019: symbole externe non résolu _mysql_real_connect@32 référencé dans la fonction _main
1>main.obj : error LNK2019: symbole externe non résolu _mysql_options@12 référencé dans la fonction _main
1>main.obj : error LNK2019: symbole externe non résolu _mysql_init@4 référencé dans la fonction _main
1>C:\ChGaLib\passage\Debug\passage.exe : fatal error LNK1120: 4 externes non résolus
1>Le journal de génération a été enregistré à l'emplacement "file://c:\ChGaLib\passage\passage\Debug\BuildLog.htm"
1>passage - 5 erreur(s), 0 avertissement(s)
========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré

16 réponses

cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
1 juil. 2009 à 11:34
Ce serait p'tèt une bonne idée de linker avec libmysql.lib
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
1 juil. 2009 à 20:44
Salut,
Pouvez-vous détailler votre idée?
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
1 juil. 2009 à 20:48
Pour faire simple, décommenter la ligne 8
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
1 juil. 2009 à 21:48
Salut,
1)
- La vesion de mysql est 5.1.30.
- J'ai trouvé seulement le dossier bin sous:
C:\Program Files\EasyPHP 3.0\mysql\bin
- J'ai ajouté le dossier include et lib qui existent dans le dossier de API mysql respectivement sous:
C:\Program Files\Microsoft Visual Studio 9.0\VC\include
C:\Program Files\Microsoft Visual Studio 9.0\VC\bin

2) Est ce que j'ajoute le dossier bin de API Mysql sous ?
C:\Program Files\Microsoft Visual Studio 9.0\VC\bin

3) - Quelles sont les étapes à suivre pour connecter une base des données sous Mysql via ODBC à partir d'un programme C ?


4) Quelle est la différence entre connexion ODBC et API Mysql?

4) J'ai décommenter la ligne 8.

Voici le code:

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <libxml/parser.h>
#include <winsock.h>
#include <mysql.h>
#pragma comment(lib,"libxml2.lib")
#pragma comment (lib,"libmysql.lib")

int main() {
    xmlDocPtr doc;
    xmlNodePtr racine;
    MYSQL mysql;
    mysql_init(&mysql);
    mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"option");

    // Ouverture du fichier XML
    doc = xmlParseFile("catalogue.xml");
    if (doc == NULL) {
        fprintf(stderr, "Document XML invalide\n");
        return EXIT_FAILURE;
    }
    // Récupération de la racine
    racine = xmlDocGetRootElement(doc);
    if (racine == NULL) {
        fprintf(stderr, "Document XML vierge\n");
        xmlFreeDoc(doc);
        return EXIT_FAILURE;
    }
    printf("La racine du document est : %s\n", racine->name);
    // Libération de la mémoire
    xmlFreeDoc(doc);

    return EXIT_SUCCESS;
    

    
    if(mysql_real_connect(&mysql,"localhost","root","","chmsi",0,NULL,0))
    {
        mysql_close(&mysql);
    }
    else
    {
        printf("Une erreur s'est produite lors de la connexion à la BDD!");
    }

   
}

Voici  le message d'erreur:

1>------ Début de la génération : Projet : passage, Configuration : Debug Win32 ------
1>Compilation en cours...
1>main.c
1>Édition des liens en cours...
1>LINK : fatal error LNK1104: impossible d'ouvrir le fichier 'libmysql.lib'
1>Le journal de génération a été enregistré à l'emplacement "file://c:\ChGaLib\passage\passage\Debug\BuildLog.htm"
1>passage - 1 erreur(s), 0 avertissement(s) Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré

SVP, j'ai besoin de vos aides.
C'est très urgent.
Merci.
0

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

Posez votre question
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
1 juil. 2009 à 23:33
Dans ton répertoire bin, il y a un fichier libmysql.lib
Copie-le dans le répertoire lib de VC++
Recompile ton projet VC++ normalement ça devrait aller.

Quelle différence entre ODBC ? ODBC gère plusieurs types de bases de données ... MySQL c'est strictement MySQL.
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
2 juil. 2009 à 00:31
J'ai ajouté le fichier libmysql.lib sous:
C:\Program Files\Microsoft Visual Studio 9.0\VC\lib

Le message d'erreur:

1>------ Début de la génération : Projet : passage, Configuration : Debug Win32 ------
1>Édition des liens en cours...
1>LINK : fatal error LNK1104: impossible d'ouvrir le fichier 'libmysql.lib'
1>Le journal de génération a été enregistré à l'emplacement "file://c:\ChGaLib\passage\passage\Debug\BuildLog.htm"
1>passage - 1 erreur(s), 0 avertissement(s)
======== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
2 juil. 2009 à 00:33
Salut,
est ce que j'ajoute libmysql.dll sous: ?
C:\ChGaLib\passage\passage\Debug
ou bien
C:\ChGaLib\passage\passage\
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
2 juil. 2009 à 01:09
Dans aucun des deux ... il doit le prendre dans le répertoire include de VC++.
Vérifie que tu l'as pas fait de faute de frappe ...
Et si tu as un stdafx.h, recompile tout le projet (menu Rebuild passage)
Si ça marche toujours pas, copie-le dans C:\ChGaLib\passage\passage\ et dans ton code fait ceci :
#pragma comment(lib,"libmysql.lib")
Recompile le code
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
2 juil. 2009 à 07:59
Salut,
je n'ai pas stdafx.h.
j''ai remarqué que libmysql.lib se trouve sous:
C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\opt

Voici le code :

#include <windows.h>
#include<stdafx.h>
#include <stdio.h>
#include <stdlib.h>
#include <libxml/parser.h>
#include <winsock.h>
#include <mysql.h>
#pragma comment(lib,"libxml2.lib")
#pragma comment(lib,"libmysql.lib")

int main() {
    xmlDocPtr doc;
    xmlNodePtr racine;
    MYSQL mysql;
    mysql_init(&mysql);
    mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"option");

    // Ouverture du fichier XML
    doc = xmlParseFile("catalogue.xml");
    if (doc == NULL) {
        fprintf(stderr, "Document XML invalide\n");
        return EXIT_FAILURE;
    }
    // Récupération de la racine
    racine = xmlDocGetRootElement(doc);
    if (racine == NULL) {
        fprintf(stderr, "Document XML vierge\n");
        xmlFreeDoc(doc);
        return EXIT_FAILURE;
    }
    printf("La racine du document est : %s\n", racine->name);
    // Libération de la mémoire
    xmlFreeDoc(doc);

    return EXIT_SUCCESS;
   

   
    if(mysql_real_connect(&mysql,"localhost","root","","chmsi",0,NULL,0))
    {
        mysql_close(&mysql);
    }
    else
    {
        printf("Une erreur s'est produite lors de la connexion à la BDD!");
    }

   
}

message d'erreur:
1>------ Début de la génération : Projet : passage, Configuration : Debug Win32 ------
1>Compilation en cours...
1>main.c
1>c:\chgalib\passage\passage\main.c(23) : fatal error C1083: Impossible d'ouvrir le fichier include : 'stdafx.h' : No such file or directory
1>Le journal de génération a été enregistré à l'emplacement "file://c:\ChGaLib\passage\passage\Debug\BuildLog.htm"
1>passage - 1 erreur(s), 0 avertissement(s) Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
2 juil. 2009 à 09:18
Replace-le dans lib et essaie de recompiler en retirant #include <stdafx.h>
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
2 juil. 2009 à 10:30
Salut,
J'ai copié libmysql.lib de
C:\Program Files\Microsoft Visual Studio 9.0\VC\lib\opt

vers

C:\Program Files\Microsoft Visual Studio 9.0\VC\lib

Alors ca marche.

Merci.

J'ai trois questions:
1) Pourquoi je trouve seulement le dossier bin  et non pas lib et include sous ?
C:\Program Files\EasyPHP 3.0\mysql

2) Quelles sont les étapes à suivre pour connecter une base des données sous Mysql via ODBC à partir d'un programme C ?

3) Quelle est la différence entre une connexion ODBC et celle de API Mysql ?

Je vous remercie pour votre aide.
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
2 juil. 2009 à 19:03
<ol>
<li>C'est une version compilée, bin étant l'abréviation de binaire, il y a dans ce répertoire des fichiers compilés.</li>
<li>Jamais fait moi-même, mais en cherchant un peu ...</li>
<li>Avec une connexion ODBC, il te suffit de changer la chaine de connexion et tu peux utiliser un tout autre SGBD.
Par contre avec libmysql, ce n'est valable que pour MySQL et si tu veux changer de SGBD, tu dois changer tout le code qui fait appel à ces fonctions.
</li>
</ol>
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
3 juil. 2009 à 09:45
3. Utiliser l'API MySQL est sensé être bien plus performant à l'exécution.
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
3 juil. 2009 à 14:42
Salut,

 Quel est le meilleur d'utiliser une connexion à une base des données Mysql dans un programme C est utiliser
ODBC ou bien API Mysql  ?
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
3 juil. 2009 à 14:47
Bin... Je ne crois pas qu'il y est de meilleur solution.

Si tu veux une appli performante, utilise l'API MySQL.
Si tu veux pouvoir par la suite facilement prendre en charge d'autres type de base de données (Oracle, SQL Server...), utilise ODBC.

Tout est affaire de compromis.
0
boualiasma Messages postés 393 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 23 décembre 2011 5
8 juil. 2009 à 11:08
Salut,


- Je voudrais établir dans mon programme C une connexion à une base de
données crée sous Mysql(j'ai instalé EasyPHP-1.7-setup). Sachant que
mon programme C est sous Visual Studio 2008.


- La vesion de mysql est 4.0.15.

- J'ai trouvé seulement le dossier bin sous:

C:\Program Files\EasyPHP 1.7\mysql\bin

pas de dossiers lib et include .


- Quelles sont les étapes à suivre pour établir cette connexion pour
que je puisse traiter des requêtes de sélection et de Mise à jour ?


- y-a-il un bon exemple de test pour vérifier ces étapes ?


Je serais très contente pour toute solution.


Je voudrais connecter à une base de données Mysql via ODBC à partir

d'un programme C sous Visual Studio 2008 Windows.

le nom de DSN est : pays_dsn

le nom d'utilisateur : root

le mot de passe est vide

Code :
 
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
 
int main()
{
SQLHENV env;
 
IF( !SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_ENV, NULL, &env)))
fprintf(stderr, "La fonction SQLAllocHandle a echoue
(SQL_HANDLE_ENV).\n");
else
{
IF( !SQL_SUCCEEDED(SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION,
(void *)SQL_OV_ODBC3, 0)))
fprintf(stderr, "La fonction SQLSetEnvAttr a echoue.\n");
else
{
SQLHDBC con;
 
IF( !SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_DBC, env,
&con)))
fprintf(stderr, "La fonction SQLAllocHandle a echoue
(SQL_HANDLE_DBC).\n");
else
{
SQLCHAR dsn[] = "pays_dsn", uid[] = "root", pwd[] =
"";
 
IF( !SQL_SUCCEEDED(SQLConnect(con, dsn, SQL_NTS, uid,
SQL_NTS, pwd, SQL_NTS)))
// IF( !SQL_SUCCEEDED(SQLConnect(con,(SQLCHAR *)"pays_dsn",
SQL_NTS,(SQLCHAR *)"root", SQL_NTS,(SQLCHAR *)"", SQL_NTS)))
fprintf(stderr, "La fonction SQLConnect a echoue.
\n");
else
{
SQLHSTMT stmt;
 
IF( !SQL_SUCCEEDED(SQLAllocHandle
(SQL_HANDLE_STMT, con, &stmt)))
fprintf(stderr, "La fonction SQLAllocHandle a
echoue (SQL_HANDLE_STMT).\n");
else
{
IF( !SQL_SUCCEEDED(SQLExecDirect(stmt,
"SELECT * FROM pays_tbl;", SQL_NTS)))
fprintf(stderr, "La fonction SQLExecDirect
a echoue.\n");
else
{
SQLCHAR pays[15], capitale[15];
 
printf("PAYS > CAPITALE\n\n");
 
while (SQL_SUCCEEDED(SQLFetch(stmt)))
{
SQLGetData(stmt, 1, SQL_C_CHAR, pays,
sizeof(pays), NULL);
SQLGetData(stmt, 2, SQL_C_CHAR,
capitale, sizeof(capitale), NULL);
printf("%-14s %-14s\n", pays,
capitale);
}
}
 
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
}
 
SQLDisconnect(con);
}
 
SQLFreeHandle(SQL_HANDLE_DBC, con);
}
}
 
SQLFreeHandle(SQL_HANDLE_ENV, env);
}
getch();
RETURN0;
 
}
 

Après la compilation et l'exécution j'aurais ce message:

La fonction SQLConnect a echoue


J'ai pris cet exemple de lien suivant:
http://melem.developpez.com/langagec/odbc/


Comment ce problème de connexion va être résolue?

Avez-vous un exemple de test pour tester ma connexion et traiter quelques requetes ?


SVP, j'ai besoin de vos aides.
0
Rejoignez-nous