如何使用ODBC从单独的线程访问DB2数据库?

问题描述:

我的CentOS 6.5 64位机器上有一个DB2数据库,并安装了ODBC驱动程序来从我的C++应用程序访问数据库。如何使用ODBC从单独的线程访问DB2数据库?

我正在使用SQL CLI API从数据库中获取数据。

如果我从C++应用程序的main()函数中获取数据,SQL CLI API可以正常工作(例如SQLAllocHandle),并且我可以从数据库读取/写入数据。

如果我尝试在我的POSIX thread上执行相同的操作,SQL CLI API无法初始化句柄,最终读取/写入失败。

SQLRETURN sqlrc = SQL_SUCCESS; 
SQLCHAR  pszSqlState[100]; 
SQLINTEGER pfNativeError[100]; 
SQLCHAR  pszErrorMsg[100]; 
SQLSMALLINT cbErrorMsgMax; 
SQLSMALLINT pcbErrorMsg; 

/* allocate an environment handle */ 
sqlrc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &m_hEnv); 
if (sqlrc != SQL_SUCCESS) 
{ 
    return 1; 
} 

sqlrc = SQLGetDiagRec(SQL_HANDLE_ENV, m_hEnv, 1, pszSqlState, pfNativeError, pszErrorMsg, 100, &pcbErrorMsg); 

/* set attribute to enable application to run as ODBC 3.0 application */ 
sqlrc = SQLSetEnvAttr(m_hEnv, 
         SQL_ATTR_ODBC_VERSION, 
         (void*)SQL_OV_ODBC3, 
         0); 

/* allocate a database connection handle */ 
sqlrc = SQLAllocHandle(SQL_HANDLE_DBC, m_hEnv, &m_hDBconn); 

sqlrc = SQLGetDiagRec(SQL_HANDLE_DBC, m_hEnv, 1, pszSqlState, pfNativeError, pszErrorMsg, 100, &pcbErrorMsg); 

/* connect to the database */ 
sqlrc = SQLConnect(m_hDBconn, 
        (SQLCHAR *)db1Alias, SQL_NTS, 
        (SQLCHAR *)user, SQL_NTS, 
        (SQLCHAR *)pswd, SQL_NTS); 

//sqlrc = SQLGetDiagRec(SQL_HANDLE_DBC, m_hDBconn, 1, pszSqlState, pfNativeError, pszErrorMsg, 100, &pcbErrorMsg); 

return sqlrc; 

我正在使用Eclipse/IBM Data Studio进行开发。

我搜索了已知的问题没有任何运气。

如何使用ODBC从单独的线程访问DB2数据库?

信息:

的第一API

SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &m_hEnv) 

返回SUCCESS但m_hEnv的值是无效的(-ve值)。

所以后续的API返回-2,它是SQL_INVALID_HANDLE。

电话

SQLSetEnvAttr(m_hEnv,SQL_ATTR_ODBC_VERSION,(void *)SQL_OV_ODBC3, 0); 
returns -2 SQL_INVALID_HANDLE . 
+0

确切的错误是什么?你得到'SQL_INVALID_HANDLE'或'SQL_ERROR'作为返回值吗?你从SQLGetDiagRec获得了什么? –

+0

我得到SQL_INVALID_HANDLE错误,SQLGetDiagRec也返回SQL_INVALID_HANDLE错误,并且不包含任何错误消息。为什么会发生这种情况,如果我从一个线程调用SQL CLI Apis,否则它工作得很好? – user3201234

+0

你是否试图在线程上分配连接(也可能是环境)?由于'SQLGetDiagRec'表明你的m_hDBconn不是一个有效的句柄?或者你对'hstmtTable'运行'SQLGetDiagRec'(当'SQLAllocHandle'失败时不能生效)? –

的问题是,我的应用程序,它使用SQL CLI代码是不使用-D_REENTRANT标志编译。 现在我可以在我的线程中使用SQL API。感谢您的投入。