У меня есть база данных DB2 на моем 64-битном компьютере CentOS 6.5 и установлены драйверы ODBC для доступа к базе данных из моего приложения C ++.
Я использую API-интерфейсы SQL CLI для извлечения данных из базы данных.
Если я получу данные из моего main()
Функция приложения C ++, API-интерфейсы SQL CLI работают нормально (например, SQLAllocHandle
) и я могу читать / записывать данные из базы данных.
Если я попытаюсь сделать ту же операцию на моем POSIX thread
API-интерфейсы SQL CLI не могут инициализировать дескриптор и в конечном итоге не удается выполнить чтение / запись.
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 для разработки.
Я гуглил на известные проблемы без какой-либо удачи.
Как получить доступ к базе данных DB2 с ODBC из отдельного потока?
Информация :
Первый 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.
Теперь я могу использовать API-интерфейсы SQL внутри своих потоков. Спасибо всем за ваш вклад.
Других решений пока нет …