我的CentOS 6.5 64位计算机上有一个DB2数据库,并且已经安装了ODBC驱动程序以从C ++应用程序访问数据库。

我正在使用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进行开发。

我没有任何运气就用Google搜索已知问题。

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

信息:

第一个APi

 SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &m_hEnv )


返回成功,但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 .

最佳答案

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

关于c++ - 如何从单独的线程使用ODBC访问DB2数据库?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21305996/

10-10 09:49
查看更多