2009-05-06 6 views
1

SQLGetDiagRec에 대한 호출에 문제가 있습니다. 그것은 아스키 모드에서 잘 작동하지만 유니 코드에서 우리의 응용 프로그램이 충돌을 일으키고, 나는 단지 왜 볼 수 없습니다. 내가 찾은 모든 문서는 내부적으로 ascii/unicode 스위치를 처리해야한다는 것을 나타냅니다. 내가 사용하는 코드는 다음과 같습니다.유니 코드 릴리스 빌드에서 SQLGetDiagRec이 충돌을 일으킴

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 라인에 주석을 달면 잘 동작합니다.

릴리스 또는 디버그가 실행 중인지 여부에 상관없이 항상 내 개발 상자에서 정상적으로 작동합니다.

이 문제에 대한 도움을 주시면 감사하겠습니다. 감사합니다.

답변

1

그럼 정답을 찾았으니 나중에 참조 할 수 있도록 여기에 포함시킬 것입니다. 내가 본 문서가 잘못되었습니다. SQLGetDiagRec는 SQLGetDiagRecW를 사용해야하는 유니 코드를 처리하지 않습니다.

+0

_UNICODE 및 UNICODE를 정의하여 SQLGetDiagRec를 SQLGetDiagRecW로 매핑 한 프로젝트를 컴파일 할 수있었습니다. Visual Studio에서 가장 쉬운 방법은 프로젝트의 속성 General-> Character Set = Use Unicode Character set로 이동하는 것입니다. –

+0

난 내가 exlicitly했다 때까지, 그러나 그것은 충돌했다, 그것은지도 shoudl 것처럼 보이는 창 코드에서 참조 할 : #ifdef와의 _UNICODE \t \t nRet = SQLGetDiagRecW (_htype, _hndle, 난, SQLSTATE, NativeError, 메시지, SQL_MAX_MESSAGE_LENGTH , & MsgLen); #else \t \t nRet = SQLGetDiagRec (_htype, _hndle, i, SqlState, & NativeError, Msg, SQL_MAX_MESSAGE_LENGTH, & MsgLen); #endif 우리는 확실히 _UNICODE와 UNICODE를 모두 정의하고 문자 세트가 유니 코드 문자 세트로 설정되어 있지만 분명히 어떤 이유로 매핑이 작동하지 않습니다. –

0

가능한 문제가 여러 개 있습니다. 첫째, 때 당신은 말 :

m_oszerrorInfo = Msg; 

m_oszerrorInfo의 종류 무엇인가? 포인터 인 경우 로컬 변수 (Msg)에 대한 포인터를 저장합니다. 해당 포인터를 나중에 사용하면 메시지가 더 이상 존재하지 않습니다.

두 번째로 밑줄로 시작하는 이름은 네임 스페이스 범위에서 컴파일러에 대해 표시됩니다. 이것이 의미하는 바를 염려하지 않으려면 밑줄로 시작하는 이름을 사용하지 마십시오.

+0

안녕하세요 닐, 난 정말이 문장을 이해하지 못했다 "둘째, 밑줄로 시작하는 이름은 네임 스페이스 범위에서 컴파일러 rerved있다"고 말했다. 설명해 주시겠습니까? 나는 호기심이다 –

+0

당신의 대답에 감사드립니다. 나는 m_oszerrorInfo가 그 라인없이 문제가 발생하고 포인터가 아니기 때문에 문제가 아니라고 확신한다. 나는 우리가 반환 된 데이터로 무언가를하고 있다는 것을 보여주기 위해 그것을 포함했다. _names를 제거하려고합니다. 그 개발자는 우리가 항상 그렇게 해왔고, 그렇게하지 못하게 설득 할 수 없었습니다. –

+0

@john - 밑줄 이름은 문제가되지 않지만 나쁜 관행입니다. –

1

문제는 아마도 sizoef(Msg)에 있습니다. 그것은 문자 수 있어야한다 :

sizeof(Msg)/sizoef(TCHAR) 
+0

또는'_countof (Msg)'를 사용하십시오. – wimh

관련 문제