Chciałem pobawić się trochę ODBC, więc zainstalowałem MySQL i MyODBC. Następnie napisałem taki prosty programik do łączenia się ze źródłem danych "otmysql":
#include <sql.h>
#include <sqlext.h>
int main(int argc, char *argv[])
{
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
/*Allocate environment handle */
if(!SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv)))
{
printf("Błąd przy wywołaniu SQLAllocHandle(SQL_HANDLE_ENV)\n");
system("PAUSE");
return EXIT_SUCCESS;
}
/* Set the ODBC version environment attribute */
if(!SQL_SUCCEEDED(SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,0)))
{
printf("Błąd przy wywołaniu SQLSetEnvAttr(SQL_ATTR_ODBC_VERSION)\n");
system("PAUSE");
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return EXIT_SUCCESS;
}
/* Allocate connection handle */
if(!SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc)))
{
printf("Błąd przy wywołaniu SQLAllocHandle(SQL_HANDLE_DBC)\n");
system("PAUSE");
SQLFreeHandle(SQL_HANDLE_ENV,henv);
return EXIT_SUCCESS;
}
/* Set login timeout to 5 seconds. */
if(!SQL_SUCCEEDED(SQLSetConnectAttr(hdbc,SQL_LOGIN_TIMEOUT,(SQLPOINTER)5,0)))
{
printf("Błąd przy wywołaniu SQLSetConnectAttr(SQL_LOGIN_TIMEOUT)\n");
system("PAUSE");
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,henv);
return EXIT_SUCCESS;
}
/* Connect to data source */
if(!SQL_SUCCEEDED(SQLConnect(hdbc,(SQLCHAR*)"otmysql",SQL_NTS,
(SQLCHAR*)"odbc",SQL_NTS,
(SQLCHAR*)"talktest",SQL_NTS)))
{
printf("Błąd przy wywołaniu SQLConnect\n");
system("PAUSE");
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,henv);
return EXIT_SUCCESS;
}
/* Allocate statement handle */
if(!SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt)))
{
printf("Błąd przy wywołaniu SQLAllocHandle(SQL_HANDLE_STMT)\n");
system("PAUSE");
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,henv);
return EXIT_SUCCESS;
}
printf ("Połączenie nawiązane\n");
system("PAUSE");
SQLFreeHandle(SQL_HANDLE_STMT,hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,henv);
return EXIT_SUCCESS;
}
Problem polega na tym, że program zawsze zgłasza błąd przy SQLConnect, podczas gdy z poziomu konfiguracji tego źródła danych (Administrative Tools->Data Sources) można się z nim połączyć bez problemów używając tego samego User ID i hasła. Używam MyODBC w wersji 3.51. Czy ktoś wie co może być przyczyną tego problemu?