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
#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();
return 0;
}
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?
SVP, j'ai besoin de vos aides.
> /....
> /....
> La fonction SQLConnect a echoue.
>
> J'ai pris cet exemple de lien suivant:
> http://melem....
>
> Comment ce probl�me de connexion va �tre r�solue?
Eviter ce genre de lien (surtout ce site..)
et prends les nombreux exemples de Msdn, comme
http://support.microsoft.com/kb/252699 ,
notamment pour la gestion d'erreurs , fonction HandleError pour savoir
l'origine de l'erreur
Et changer le driver pour MYSQL bien sur.
Et c'est plus simple avec les libs MYSQL : voir le lien donn� r�cemment :
http://www.arcanthea.com/opensource/tutoriels/vcpp-mysql/vcpp-mysql-tut.pdf
cela suppose d'avoir cr�� l'alias de connexion ODBC, l'as-tu fait ?
relire <http://dev.mysql.com/doc/refman/5.1/en/connector-odbc.html>
en cas de besoin.
comme sugg�r�, il est bcp plus efficace (voire simple car les erreurs
sont moins masqu�es) d'utiliser directement l'API mySQL.
le "connector/C++" est �galement une bonne alternative pour d�buter
<http://dev.mysql.com/doc/refman/5.1/en/connector-cpp.html>
Sylvain.
comme les autres réponses (Msdn et mysqllib) et pour ODBC, active les
Traces ODBC et tu auras de suite la cause de l'erreur
Salut,
Après la compilation et l'exécution j'obtiens:
retcode = -1 // c'est la valeur de retour de SQLConnect
Erreur sur l'instruction SQLConnect Impossible de se connecter a la
source de donnees:
1. [
- Qu'est ce que signifie ce message d'erreur ?: 1. [
> Apr�s la compilation et l'ex�cution j'obtiens:
> retcode = -1 // c'est la valeur de retour de SQLConnect
> Erreur sur l'instruction SQLConnect Impossible de se connecter a la
> source de donnees:
> 1. [
>
> - Qu'est ce que signifie ce message d'erreur ?: 1. [
Apparemment tu n'as m�me pas utilis� HandleError !
> Apr�s la compilation et l'ex�cution j'obtiens:
> retcode = -1 // c'est la valeur de retour de SQLConnect
Quel rapport avec l'activation des _Traces_ ODBC ?
- Comment je vais utiliser HandleError ?
- J'ai utilisé la fonction SQLGetDiagField()
Voici mon code :
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include<stdlib.h>
#include<string.h>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>
void sql_perror(SQLSMALLINT HandleType, SQLHANDLE Handle, const char *
title)
{
SQLCHAR s[SQL_MAX_MESSAGE_LENGTH];
SQLSMALLINT ligne = 1;
fprintf(stderr, "%s :\n", title);
while (SQLGetDiagField(HandleType, Handle, ligne,
SQL_DIAG_MESSAGE_TEXT, s, sizeof(s), NULL) != SQL_NO_DATA)
{
fprintf(stderr, "%d. %s\n", ligne, s);
ligne++;
}
}
void main()
{
SQLRETURN retcode;
SQLINTEGER lon,la,lb,lc,ld,taille=SQL_NTS;
SQLCHAR design[20];
SQLHDBC hdbc;
SQLHENV henv;
SQLHSTMT hstmt;
/*Allocate environment handle */
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) //{
/* Set the ODBC version environment attribute */
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)
SQL_OV_ODBC3, 0);
if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) //{
/* Allocate connection handle */
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
// if (retcode == SQL_SUCCESS || retcode ==
SQL_SUCCESS_WITH_INFO)
//printf("%s","vrai");
//else
//printf("erreur\n");
// }
//}
// retcode = SQLConnect(hdbc,(SQLCHAR*)dsn, SQL_NTS,
(SQLCHAR*)uid, SQL_NTS,(SQLCHAR*)pwd, SQL_NTS);
retcode=SQLConnect(hdbc,(SQLCHAR *)"pays_dsn",SQL_NTS,(SQLCHAR
*)"root",SQL_NTS,(SQLCHAR *)"",SQL_NTS);
printf("retcode=%d",retcode);
if(retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
printf("\n%s","vrai");
else
{
printf("\nErreur sur l'instruction SQLConnect ");
sql_perror(SQL_HANDLE_DBC, hdbc, "Impossible de se connecter a la
source de donnees");
}
}
Comme dans l'exemple de Microsoft :
if (nstatus != SQL_SUCCESS && nstatus != SQL_SUCCESS_WITH_INFO)
{
HandleError(hdbc,SQL_HANDLE_STMT,nstatus);
return;
}
et �a doit donner un libell� plus pr�cis, non ?
Et comme avait dit Marc, active les traces ODBC pour voir les d�tails
Comment je vais activer les traces ODBC ?
> programmation wrote:
> Comment je vais activer les traces ODBC ?
Soit manuellement, par odbcad32
Soit par SQLSetConnectAttr() ou SQLSetConnectOption()
Soit par SQLSetConnectAttr() ou SQLSetConnectOption()
Comment je vais utiliser dans mon programme SQLSetConnectAttr() ou
SQLSetConnectOption() ?
Merci.
>>Soit manuellement, par odbcad32
>
> Comment manuellement par odbcad32 ?
Comment �a "comment" ?
Le DSN, tu l'as bien cr�� avec odbcad32 ?
Et il y a bien l'onglet "Tracing" ou "Tra�age" ?
> Le DSN, tu l'as bien créé avec odbcad32 ?
Je trouve dans les propriétés de projet les dépendances
supplémentaires les fichiers suivants :
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib
advapi32.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
odbc32.lib
odbccp32.lib
Alors, je ne trouve pas odbcad32.
> Et il y a bien l'onglet "Tracing" ou "Traçage" ?
Oui. Il y a l'onglet "Traçage".