У меня есть база данных 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 .
Какая ошибка? Получаете ли вы 'SQL_INVALID_HANDLE' или' SQL_ERROR' в качестве возвращаемого значения? Что вы получаете от 'SQLGetDiagRec'? –
Я получаю ошибку SQL_INVALID_HANDLE, SQLGetDiagRec также возвращает ошибку SQL_INVALID_HANDLE и не содержит никакого сообщения об ошибке. Почему это происходит, если я вызываю SQL CLI Apis из потока, иначе он работает нормально? – user3201234
Вы пытались выделить соединение (и, возможно, также окружение) в потоке? Поскольку 'SQLGetDiagRec' указывает, что ваш m_hDBconn не является допустимым дескриптором? Или ваш пробег «SQLGetDiagRec» против «hstmtTable» (который не может быть действительным, если «SQLAllocHandle» не работает)? –