如何使用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 .
答
的问题是,我的应用程序,它使用SQL CLI代码是不使用-D_REENTRANT标志编译。 现在我可以在我的线程中使用SQL API。感谢您的投入。
确切的错误是什么?你得到'SQL_INVALID_HANDLE'或'SQL_ERROR'作为返回值吗?你从SQLGetDiagRec获得了什么? –
我得到SQL_INVALID_HANDLE错误,SQLGetDiagRec也返回SQL_INVALID_HANDLE错误,并且不包含任何错误消息。为什么会发生这种情况,如果我从一个线程调用SQL CLI Apis,否则它工作得很好? – user3201234
你是否试图在线程上分配连接(也可能是环境)?由于'SQLGetDiagRec'表明你的m_hDBconn不是一个有效的句柄?或者你对'hstmtTable'运行'SQLGetDiagRec'(当'SQLAllocHandle'失败时不能生效)? –