2009-05-06 12 views
1

Je rencontre un problème avec l'appel de SQLGetDiagRec. Cela fonctionne très bien en mode ascii, mais en unicode, cela bloque notre application, et je ne vois pas pourquoi. Toute la documentation que j'ai pu trouver semble indiquer qu'il devrait gérer le commutateur ascii/unicode en interne. Le code que j'utilise est:SQLGetDiagRec provoque un blocage dans la version de publication 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; 
} 

Tout va bien jusqu'à ce que cette fonction tente de revenir, puis l'application se bloque. Il ne revient jamais à la ligne de code après l'appel de get_sqlErrorInfo.

Je sais que c'est où le problème est parce que j'ai mis le code de diagnostic dedans et il passe le SQLGetDiagRec d'accord et il fnishes cette fonction.

Si je commente la ligne SQLGetDiagRec cela fonctionne très bien.

Cela fonctionne toujours bien sur ma boîte de développement si elle est en cours d'exécution ou de débogage.

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

Répondre

1

Eh bien, j'ai trouvé la bonne réponse, alors j'ai pensé que je l'inclurais ici pour référence future. La documentation que j'ai vu était fausse. SQLGetDiagRec ne gère pas Unicode J'ai besoin d'utiliser SQLGetDiagRecW.

+0

Vous pourriez avoir compilé le projet avec _UNICODE et UNICODE définis, qui auraient mappé SQLGetDiagRec à SQLGetDiagRecW. Dans Visual Studio, la méthode la plus simple consiste à accéder aux propriétés de votre projet Général-> Jeu de caractères = Utiliser le jeu de caractères Unicode. –

+0

Je vois dans le code Windows qu'il ressemble à ce shoudl la carte, mais il plantait jusqu'à ce que je exlicitly ai fait: #ifdef _UNICODE \t \t nRet = SQLGetDiagRecW (_htype, _hndle, i, SqlState, & NativeError, Msg, SQL_MAX_MESSAGE_LENGTH , & MsgLen); #else \t \t nRet = SQLGetDiagRec (_htype, _hndle, i, SqlState, et NativeError, Msg, SQL_MAX_MESSAGE_LENGTH, & MsgLen); #endif Nous avons bien défini _UNICODE et UNICODE et le jeu de caractères est défini sur le jeu de caractères Unicode, mais apparemment, pour une raison quelconque, le mappage ne fonctionnait pas. –

0

Un coplule de problèmes possibles. Tout d'abord, quand vous dites:

m_oszerrorInfo = Msg; 

quel est le type de m_oszerrorInfo? Si c'est un pointeur, vous stockez un pointeur sur une variable locale (Msg). Si vous utilisez ce pointeur plus tard, Msg n'existe plus. Deuxièmement, les noms qui commencent par un trait de soulignement sont réservés pour le compilateur à l'étendue de l'espace de noms. Pour ne pas avoir à vous soucier de ce que cela signifie, n'utilisez pas de noms commençant par des traits de soulignement.

+0

Salut Neil, je ne comprends pas vraiment cette phrase: « En second lieu, les noms qui commencent par un trait de soulignement sont rerved pour le compilateur à périmètre d'espace de noms. » Pourriez-vous m'expliquer s'il vous plaît? Je suis curieux –

+0

Merci pour votre réponse. Je suis assez sûr que m_oszerrorInfo n'est pas le problème car le problème se produit même sans cette ligne et ce n'est pas un pointeur. Je l'ai seulement inclus pour montrer que nous faisons quelque chose avec les données retournées. Je vais essayer de supprimer les _names, c'est un développeur que nous avions l'habitude d'avoir fait cela et nous ne pouvions pas le convaincre de ne pas le faire. –

+0

@john - Les noms de soulignement ne seront pas le problème, mais ils sont une mauvaise pratique. –

1

Le problème est probablement dans le sizoef(Msg). Il devrait être le nombre de caractères:

sizeof(Msg)/sizoef(TCHAR) 
+0

ou utilisez '_countof (Msg)' – wimh

Questions connexes