Как получить доступ к базе данных DB2 с ODBC из отдельного потока?

У меня есть база данных DB2 на моем 64-битном компьютере CentOS 6.5 и установлены драйверы ODBC для доступа к базе данных из моего приложения C ++.

Я использую API-интерфейсы SQL CLI для извлечения данных из базы данных.

Если я получу данные из моего main() Функция приложения C ++, API-интерфейсы SQL CLI работают нормально (например, SQLAllocHandle) и я могу читать / записывать данные из базы данных.

Если я попытаюсь сделать ту же операцию на моем POSIX threadAPI-интерфейсы 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 .

1

Решение

Проблема была в том, что мое приложение, использующее код SQL CLI, не было скомпилировано с использованием флага -D_REENTRANT.
Теперь я могу использовать API-интерфейсы SQL внутри своих потоков. Спасибо всем за ваш вклад.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector