Domanda

Sto riscontrando un problema con la chiamata a SQLGetDiagRec. Funziona bene in modalità ASCII, ma in Unicode provoca il crash della nostra app e non riesco proprio a capire perché. Tutta la documentazione che sono riuscito a trovare sembra indicare che dovrebbe gestire internamente l'interruttore ascii / unicode. Il codice che sto usando è:

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

va tutto bene finché questa funzione non tenta di tornare, quindi l'app si arresta in modo anomalo. Non torna mai alla riga di codice dopo la chiamata a get_sqlErrorInfo.

So che è qui che si trova il problema perché ho inserito il codice di diagnostica e supera OKGetDiagRec e funziona correttamente.

Se commento la riga SQLGetDiagRec funziona bene.

Funziona sempre bene sulla mia scatola di sviluppo indipendentemente dal fatto che sia in esecuzione la versione o il debug.

Qualsiasi aiuto su questo problema sarebbe molto apprezzato. Grazie

È stato utile?

Soluzione

Beh, ho trovato la risposta corretta, quindi ho pensato di includerla qui per riferimento futuro. La documentazione che ho visto era sbagliata. SQLGetDiagRec non gestisce Unicode di cui avevo bisogno per usare SQLGetDiagRecW.

Altri suggerimenti

Il problema è probabilmente nel sizoef (Msg) . Dovrebbe essere il numero di caratteri:

sizeof(Msg)/sizoef(TCHAR)

Un copuple di possibili problemi. Innanzitutto, quando dici:

m_oszerrorInfo = Msg;

qual è il tipo di m_oszerrorInfo? Se si tratta di un puntatore, si sta memorizzando un puntatore in una variabile locale (Msg). Se si utilizza quel puntatore in seguito, il messaggio non esisterà più.

In secondo luogo, i nomi che iniziano con un carattere di sottolineatura vengono assegnati al compilatore nell'ambito dello spazio dei nomi. Per non doverti preoccupare di cosa significhi, non utilizzare nomi che iniziano con caratteri di sottolineatura.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top