2014-01-23 6 views
1

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

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

Если я извлекаю данные из моей функции main() приложения C++, 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 для разработки.

Я погулял по известным вопросам без везения.

Как получить доступ к базе данных 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 . 
+0

Какая ошибка? Получаете ли вы 'SQL_INVALID_HANDLE' или' SQL_ERROR' в качестве возвращаемого значения? Что вы получаете от 'SQLGetDiagRec'? –

+0

Я получаю ошибку SQL_INVALID_HANDLE, SQLGetDiagRec также возвращает ошибку SQL_INVALID_HANDLE и не содержит никакого сообщения об ошибке. Почему это происходит, если я вызываю SQL CLI Apis из потока, иначе он работает нормально? – user3201234

+0

Вы пытались выделить соединение (и, возможно, также окружение) в потоке? Поскольку 'SQLGetDiagRec' указывает, что ваш m_hDBconn не является допустимым дескриптором? Или ваш пробег «SQLGetDiagRec» против «hstmtTable» (который не может быть действительным, если «SQLAllocHandle» не работает)? –

ответ

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^