【问题标题】:Message: [unixODBC][Driver Manager]Can't open lib 'MySQL ODBC 5.1 Driver' : file not foundnSQLSTATE: 01000消息:[unixODBC][Driver Manager]Can't open lib 'MySQL ODBC 5.1 Driver' : file not foundnSQLSTATE: 01000
【发布时间】:2014-06-04 10:31:35
【问题描述】:

我想使用 c++ 和 mysql 创建一个 odbc 连接,并且我附上了我的代码。 请帮我纠正错误,这是我发布的问题的标题。

#include <iostream>
#include <sql.h>
#include <sqlext.h>
#include <sqltypes.h>

using namespace std;

void show_error(unsigned int handletype, const SQLHANDLE& handle) {
    SQLCHAR sqlstate[1024];
    SQLCHAR message[1024];
    if(SQL_SUCCESS == SQLGetDiagRec(handletype, handle,
           1, sqlstate, NULL, message, 1024, NULL))
        cout<<"Message: "<<message<<"SQLSTATE: "<<sqlstate<<endl;
}

int main() {
    SQLHANDLE sqlenvhandle;    
    SQLHANDLE sqlconnectionhandle;
    SQLHANDLE sqlstatementhandle;
    SQLRETURN retcode;

    if(SQL_SUCCESS!=SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &sqlenvhandle))
        goto FINISHED;

    if(SQL_SUCCESS!=SQLSetEnvAttr(sqlenvhandle,
           SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0)) 
        goto FINISHED;

    if(SQL_SUCCESS!=SQLAllocHandle(SQL_HANDLE_DBC, sqlenvhandle, &sqlconnectionhandle))
        goto FINISHED;

    SQLCHAR retconstring[1024];
    switch(SQLDriverConnect (sqlconnectionhandle, NULL, 
                (SQLCHAR*)"DRIVER={MySQL ODBC 5.1 Driver};PORT=3306;SERVER=localhost;DATABASE=market;UID=root;PWD=123;", 
                SQL_NTS, 
                retconstring, 
                1024, 
                NULL,
                SQL_DRIVER_NOPROMPT)){
     case SQL_SUCCESS_WITH_INFO:
          show_error(SQL_HANDLE_DBC, sqlconnectionhandle);
          break;
     case SQL_INVALID_HANDLE:
     case SQL_ERROR:
          show_error(SQL_HANDLE_DBC, sqlconnectionhandle);
          goto FINISHED;
     default:
          break;
    }

    if(SQL_SUCCESS!=SQLAllocHandle(SQL_HANDLE_STMT, 
           sqlconnectionhandle, &sqlstatementhandle))
        goto FINISHED;

    if(SQL_SUCCESS!=SQLExecDirect(sqlstatementhandle
           SQLCHAR*)"select * from employee", SQL_NTS)) {
        show_error(SQL_HANDLE_STMT, sqlstatementhandle);
        goto FINISHED;
    }
    else{
        char name[64];
        char dept[64];

        while(SQLFetch(sqlstatementhandle)==SQL_SUCCESS){
            SQLGetData(sqlstatementhandle, 1, SQL_C_CHAR, name, 64, NULL);
            SQLGetData(sqlstatementhandle, 2, SQL_C_CHAR, dept, 64, NULL);
            cout<<" "<<name<<" "<<dept<<endl;
        }
    }

    FINISHED:
    SQLFreeHandle(SQL_HANDLE_STMT, sqlstatementhandle );
    SQLDisconnect(sqlconnectionhandle);
    SQLFreeHandle(SQL_HANDLE_DBC, sqlconnectionhandle);
    SQLFreeHandle(SQL_HANDLE_ENV, sqlenvhandle);

}

【问题讨论】:

  • 其实,现在我看到它是你的连接字符串...你需要将{MySQL ODBC 5.1 Driver}替换为MySQL驱动程序的位置(作为DLL或共享库)。
  • jsantander,不,你没有。

标签: c++ mysql linux odbc


【解决方案1】:

您对 SQLDriverConnect 的调用中的 Driver 属性是“MySQL ODBC 5.1 Driver”,因此您的 odbcinst.ini 文件中应该有如下条目:

[MySQL ODBC 5.1 Driver]
driver = /some/path/to/libxxx.so

您需要检查 /some/path/to/libxxx.so 是否存在、是否可读、可执行,最后可能在其上运行 ldd 以确保它所依赖的任何内容都已安装。

您可以使用命令 odbcinst -j 找到您的 odbcinst.ini 文件。

【讨论】:

    【解决方案2】:

    您需要确保完成下面列出的所有步骤。

    1) 在驱动程序的 so 文件上运行 ldd 以检查是否加载了所有必需的库。如果您发现有些库找不到,请在 LD_LIBRARY_PATH 环境变量中手动添加这些库的路径。

    2) 如果 odbcinst.ini 文件不存在,则创建它并添加以下条目

    [MySQL ODBC 5.1 Driver]
    Description     = ODBC for MySQL
    Driver          = <Path_to_Dir_where_you_have_installed_driver>/libxxx.so
    Setup           = <Path_to_Dir_where_you_have_installed_driver>/libxxx.so
    

    3) 设置环境变量 ODBCINST 指向刚刚创建的 odbcinst.ini。 例如如果你使用的是 bash shell,你可以像下面这样设置变量

    export ODBCINST=<path_to_dir_where_odbcinst.ini_is_craeted>/odbcinst.ini
    

    您可以根据您使用的 shell 相应地更改命令。

    4) 在某些情况下,仅设置 ODBCINST 是不够的,您需要设置 ODBCSYSINI 以确保它正在获取您在上一步中设置的 ODBCINST 的 odbcinst.ini 文件。

    export ODBCSYSINI=<path_to_dir_where_odbcinst.ini_is_created>
    

    再次根据您使用的 shell 更改命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 2021-02-03
      • 2014-02-09
      • 2016-04-19
      • 2018-08-24
      • 1970-01-01
      相关资源
      最近更新 更多