我的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/