본문 바로가기

공부/윈도우api

SQLConnect함수 사용시 에러 처리를 위한 odbc와 visual c++ 6.0 호환성 문제 해결

반응형

DBMS 에 접속 하기 위해 ODBC 에 정보를 등록하고 SQLConnect 를 사용할 때 오류가 발생 한다면 32, 64 BIT 호환성 문제를 확인할 필요가 있다.

OS 가 64bit 이고 SQLConnect 를 사용하는 프로그램이 32bit 로 빌드 되었다면 이 문제가 맞다.

그렇지 않다면, 다른 곳에서 문제를 찾기 바란다.

SQLConnect 실패 후에 SQLGetDiagRec 를 통해 오류 내용을 받아보면 ERROR_CODE 는 14, SQL_STATE 는 "08001" 이 나오고 에러 메시지는 "[Microsoft][ODBC SQL Server Driver][DBNETLIB]잘못된 연결입니다." 또는 "지정된 DSN은 드라이버와 응용 프로그램 간 아키텍처 불일치를 포함합니다." 라고 출력 된다.

이 문제에 대한 원인은 윈도우 64bit OS 에는 ODBC 관리자가 32bit 용 64bit 용이 따로 있기 때문이다.

그래서 32bit 응용프로그램에서 접속을 하려면 32bit 용 ODBC 관리자를 통해 정보를 작성해야 한다.

64bit OS 에서 "관리 도구" - "데이타 원본(ODBC)" 를 실행 한다면, 64bit 용 ODBC 관리자가 실행된 것이다.

32bit ODBC 관리자: C:\Windows\SysWOW64\odbcad32.exe

64bit ODBC 관리자: C:\Windows\System32\odbcad32.exe

결론적으로 32bit 로 빌드된 프로그램에서 64bit OS 의 ODBC 에 등록 하려면 "C:\Windows\SysWOW64\odbcad32.exe" 를 실행하여 ODBC 를 등록해야 한다.

 

solve.txt

odbc 연결 확인 소스:

#include <stdio.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>


SQLRETURN ret;
int iDiag;
SQLINTEGER NativeError;
SQLCHAR SqlState[6], Msg[255];
SQLSMALLINT MsgLen;
TCHAR Mes[1024];
SQLHENV hEnv;
SQLHDBC hDbc;
SQLHSTMT hStmt;
 
int main()
{
 //연결설정을 위한 변수들
 SQLRETURN ret;

  if(SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv) != SQL_SUCCESS)
   return FALSE;
  if(SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER) != SQL_SUCCESS)
   return FALSE;
  if(SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc) != SQL_SUCCESS)
   return FALSE;
 
  //MDB 파일에 연결하기
  ret = SQLConnect(hDbc, (SQLCHAR*)"mysql", SQL_NTS, (SQLCHAR*)"root", SQL_NTS, (SQLCHAR*)"0652dlekt", SQL_NTS);

  if(ret == SQL_SUCCESS)
  {
   printf("성공\n");
  }

  if((ret != SQL_SUCCESS) && (ret != SQL_SUCCESS_WITH_INFO))
  {
  for (iDiag=1;;iDiag++) {
   ret=SQLGetDiagRec(SQL_HANDLE_DBC, hDbc, iDiag, SqlState,
    &NativeError, Msg, sizeof(Msg), &MsgLen);
   if (ret==SQL_NO_DATA)
    break;
   wsprintf(Mes, "SQLSTATE:%s, NativeError:%d, 진단정보:%s",
    (LPCTSTR)SqlState,NativeError, (LPCTSTR)Msg); 
   printf("%s\n", Mes);
  }
  
  return FALSE;
  }

 return 0;

}

반응형