SQLGetDiagRec вызывает сбой в сборке релиза Unicode - PullRequest
1 голос
/ 06 мая 2009

У меня проблема с вызовом SQLGetDiagRec. Он отлично работает в режиме ascii, но в Юникоде вызывает сбой нашего приложения, и я просто не понимаю, почему. Кажется, вся документация, которую я смог найти, указывает на то, что она должна обрабатывать переключатель ascii / unicode внутри. Код, который я использую:

void clImportODBCFileTask::get_sqlErrorInfo( const SQLSMALLINT _htype, const SQLHANDLE _hndle )
{
SQLTCHAR      SqlState[6];
SQLTCHAR      Msg[SQL_MAX_MESSAGE_LENGTH];
SQLINTEGER    NativeError;
SQLSMALLINT   i, MsgLen;
SQLRETURN     nRet;

memset ( SqlState, 0, sizeof(SqlState) );
memset ( Msg, 0, sizeof(Msg) );

// Get the status records.
i = 1;

//JC - 2009/01/16 - Start fix for bug #26878
m_oszerrorInfo.Empty();

nRet = SQLGetDiagRec(_htype, _hndle, i, SqlState, &NativeError, Msg, sizeof(Msg), &MsgLen);
m_oszerrorInfo = Msg;
}

все в порядке, пока эта функция не попытается вернуться, затем приложение вылетает. Он никогда не возвращается к строке кода после вызова get_sqlErrorInfo.

Я знаю, что именно в этом проблема, потому что я вставил диагностический код, и он проходит через SQLGetDiagRec, и это завершает эту функцию.

Если я прокомментирую строку SQLGetDiagRec, она будет работать нормально.

Он всегда отлично работает на моей машине для разработки, независимо от того, запущен ли релиз или отладка.

Любая помощь по этой проблеме будет принята с благодарностью. Спасибо

Ответы [ 3 ]

1 голос
/ 07 июля 2009

Ну, я нашел правильный ответ, поэтому я подумал, что включу его сюда для дальнейшего использования. Документация, которую я видел, была неправильной. SQLGetDiagRec не обрабатывает Unicode, мне нужно было использовать SQLGetDiagRecW.

1 голос
/ 23 декабря 2012

Проблема, вероятно, в sizoef(Msg). Должно быть количество символов:

sizeof(Msg)/sizoef(TCHAR)
0 голосов
/ 06 мая 2009

Множество возможных проблем. Во-первых, когда вы говорите:

m_oszerrorInfo = Msg;

какой тип m_oszerrorInfo? Если это указатель, вы храните указатель на локальную переменную (Msg). Если вы используете этот указатель позже, Msg больше не будет существовать.

Во-вторых, имена, начинающиеся с подчеркивания, резервируются для компилятора в области имен. Чтобы не беспокоиться о том, что это значит, не используйте имена, начинающиеся с подчеркивания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...