我的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 .
答案 0 :(得分:0)
问题是,我使用SQL CLI代码的应用程序没有使用-D_REENTRANT标志编译。 现在我可以在我的线程中使用SQL API。谢谢大家的投入。