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 를 등록해야 한다.
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;
}