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?