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

时间:2014-01-23 10:51:13

标签: c++ multithreading db2 odbc unixodbc

我的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进行开发。

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

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

信息:

第一个APi

 SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &m_hEnv ) 

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

因此后续API返回-2,即SQL_INVALID_HANDLE。

致电

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

1 个答案:

答案 0 :(得分:0)

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