SQLGetDiagRec导致Unicode发布版本崩溃

时间:2009-05-06 12:26:08

标签: c++ unicode odbc

我遇到了调用SQLGetDiagRec的问题。它在ascii模式下工作正常,但在unicode中它会导致我们的应用程序崩溃,我只是看不清楚原因。我能找到的所有文档似乎都表明它应该在内部处理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 个答案:

答案 0 :(得分:1)

我找到了正确的答案,所以我想我会把它包含在这里供将来参考。我看到的文件是错误的。 SQLGetDiagRec不处理使用SQLGetDiagRecW所需的Unicode。

答案 1 :(得分:1)

问题可能出在sizoef(Msg)。它应该是字符数:

sizeof(Msg)/sizoef(TCHAR)

答案 2 :(得分:0)

可能出现问题的副本。首先,当你说:

m_oszerrorInfo = Msg;

m_oszerrorInfo的类型是什么?如果是指针,则存储指向局部变量(Msg)的指针。如果稍后使用该指针,Msg将不再存在。

其次,在命名空间范围内为编译器重新创建以下划线开头的名称。为了不必担心这意味着什么,不要使用以下划线开头的名称。