Программа Linux ODBC c++ завершается с ошибкой во время SQLConnect с вызовом get_charset_by_csname. Почему?Linux

Ответить Пред. темаСлед. тема
Anonymous
 Программа Linux ODBC c++ завершается с ошибкой во время SQLConnect с вызовом get_charset_by_csname. Почему?

Сообщение Anonymous »

стек сбоев
ниже показано мое основное кодирование, работа в Linux приводит к сбою, на рисунке выше — стек сбоев, но я не знаю почему. «MY_SQL_CHAR» — это «SQLCHAR», но в Windows — «SQLWCHAR», кодирование при запуске в Windows в порядке. Он может подключиться к успешному подключению odbc в Windows. но при запуске в Linux происходит сбой при выполнении sqlconnect. odbc подключается к td -sql.

Код: Выделить всё

int COdbcConnect::Connect(const char* pDataSource)
{
LOG_WARNING(g_pLogHandle, "xxxxxxxxxx, pDataSource:%s", pDataSource); ///test3
m_strDataSource = std::string(pDataSource);
SQLRETURN ret;
if (m_pEnv == NULL)
{
if (false == initEnv(m_pEnv)) ///test3
{
return 1;
}
}
UTIL_Strcpy(m_pEnv->dataSource, MAX_DATA_SOURCE_LENGTH, pDataSource);

CloseConnect();
try
{
ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &(m_pEnv->hEnv));

if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
{
m_bConnected = false;
ONLY_CHECK_ERROR(ret,"Connect: when exec SQLAllocHandle",m_pEnv->hEnv,SQL_HANDLE_ENV)
SQLFreeHandle(SQL_HANDLE_ENV, m_pEnv->hEnv);
return 2;
}

ret=SQLSetEnvAttr((m_pEnv->hEnv), SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
{
m_bConnected = false;
ONLY_CHECK_ERROR(ret,"Connect: when exec SQLAllocHandle",m_pEnv->hEnv,SQL_HANDLE_ENV)
SQLFreeHandle(SQL_HANDLE_ENV, m_pEnv->hEnv);
return 3;
}

ret = SQLAllocHandle(SQL_HANDLE_DBC, m_pEnv->hEnv, &(m_pEnv->hDbc));
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
m_bConnected = false;
ONLY_CHECK_ERROR(ret,"Connect: allocate odbc connection handler",m_pEnv->hEnv,SQL_HANDLE_ENV);
SQLFreeHandle(SQL_HANDLE_DBC, m_pEnv->hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, m_pEnv->hEnv);
return 4;
}

LOG_WARNING(g_pLogHandle, "ret = %d, datasource = %p, %s, m_pEnv->hDbc:%p", ret, m_pEnv->dataSource, m_pEnv->dataSource, m_pEnv->hDbc); ///test3
ret=SQLConnect((m_pEnv->hDbc), (MY_SQL_CHAR*)"smarteazy",
SQL_NTS, (MY_SQL_CHAR *)NULL, SQL_NTS, (MY_SQL_CHAR *)NULL,
SQL_NTS); ///test3
//const char* pAbc = "smarteazy";
//ret=SQLConnect((m_pEnv->hDbc), (MY_SQL_CHAR*)pAbc,
//     SQL_NTS, (MY_SQL_CHAR *)NULL, SQL_NTS, (MY_SQL_CHAR *)NULL,
//     SQL_NTS); ///test3
//ret=SQLConnect((env->hDbc), (SQLCHAR*)env->data_source,
//    SQL_NTS, (SQLCHAR *)NULL, SQL_NTS, (SQLCHAR *)NULL,
//    SQL_NTS);

//LOG_WARNING(g_pLogHandle, "ret = %d, datasource = %s", ret, m_pEnv->dataSource); ///test3
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO) {
// 连接失败
m_bConnected = false;
ONLY_CHECK_ERROR(ret,"Connect: when exec SQLConnect",m_pEnv->hEnv,SQL_HANDLE_ENV);
SQLFreeHandle(SQL_HANDLE_DBC, m_pEnv->hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, m_pEnv->hEnv);
return 5;
}

ret = SQLAllocHandle(SQL_HANDLE_STMT, (m_pEnv->hDbc), &(m_pEnv->hStmt));
if (ret != SQL_SUCCESS && ret != SQL_SUCCESS_WITH_INFO)
{
m_bConnected = false;
ONLY_CHECK_ERROR(ret,"Connect: when exec SQLAllocHandle",m_pEnv->hEnv,SQL_HANDLE_ENV)
SQLFreeHandle(SQL_HANDLE_STMT, m_pEnv->hStmt);
SQLFreeHandle(SQL_HANDLE_DBC, m_pEnv->hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, m_pEnv->hEnv);
return 6;
}
else
{
m_bConnected = true;
}
}
catch (char* pError)
{
LOG_WARNING(g_pLogHandle, "catch exception error:%s", pError);
m_bConnected = false;
ONLY_CHECK_ERROR(ret,"Connect: when exec SQLAllocHandle",m_pEnv->hEnv,SQL_HANDLE_ENV);
SQLFreeHandle(SQL_HANDLE_STMT, m_pEnv->hStmt);
SQLFreeHandle(SQL_HANDLE_DBC, m_pEnv->hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, m_pEnv->hEnv);
return 7;
}

return 0;
}
На картинке выше изображен стек сбоев, но я не знаю, почему.

Подробнее здесь: https://stackoverflow.com/questions/784 ... sname-call
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Linux»