1 votes

SQLGetDiagRec provoque un crash dans la version Unicode de l'application

J'ai un problème avec l'appel à SQLGetDiagRec. Il fonctionne bien en mode ascii, mais en mode unicode, il fait planter notre application, et je ne vois pas pourquoi. Toute la documentation que j'ai pu trouver semble indiquer que l'application devrait gérer le changement ascii/unicode en interne. Le code que j'utilise est le suivant :

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;
}

tout va bien jusqu'à ce que cette fonction essaie de revenir, puis l'application se plante. Elle ne revient jamais à la ligne de code qui suit l'appel à get_sqlErrorInfo.

Je sais que c'est là que se trouve le problème car j'ai mis du code de diagnostic et il passe le SQLGetDiagRec ok et il termine cette fonction.

Si je commente la ligne SQLGetDiagRec, cela fonctionne bien.

Il fonctionne toujours bien sur ma machine de développement, qu'elle soit en version ou en débogage.

Toute aide sur ce problème serait grandement appréciée. Merci

1voto

Daniel Kats Points 193

J'ai trouvé la bonne réponse, alors j'ai pensé l'inclure ici pour référence future. La documentation que j'ai vue était fausse. SQLGetDiagRec ne gère pas l'Unicode, je devais utiliser SQLGetDiagRecW.

1voto

dr18 Points 11

Le problème se situe probablement dans le sizoef(Msg) . Il doit s'agir du nombre de caractères :

sizeof(Msg)/sizoef(TCHAR)

0voto

Un copuple de problèmes possibles. Premièrement, quand vous dites :

m_oszerrorInfo = Msg;

Quel est le type de m_oszerrorInfo ? Si c'est un pointeur, vous stockez un pointeur vers une variable locale (Msg). Si vous utilisez ce pointeur plus tard, Msg n'existera plus.

Deuxièmement, les noms qui commencent par un trait de soulignement sont réservés pour le compilateur à la portée de l'espace de nom. Pour ne pas avoir à vous soucier de ce que cela signifie, n'utilisez pas de noms commençant par un trait de soulignement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X