먼저 DBMS에 대해 설명드리겠습니다. DBMS는 데이터베이스관리 시스템으로 데이터와 응용 프로그램의 중간에서 응용 프로그램이 요구하는 대로 데이터를 정의하고, 읽고, 쓰고, 갱신하는 등의 데이터를 조작하고 관리하는 프로그램입니다. DBMS의 종류에는 액세스, MySQL, 파라독스, 오라클 등 수많은 DBMS가 있습니다. 문제점은 DBMS는 서로 호환되지 않기 떄문에 개발자가 이런 데이타베이스를 제어하기 위해서는 모든 데이타베이스의 사용방법이나 제어방법을 터득해야만 하고사용하던 DBMS를 다른 DBMS로 전환하게 되면 개발되었던 프로그램들도 모두 변경해야 합니다. 이런 문제점을 해결하는 것이 ODBC입니다.
ODBC가 동작하는 방식은 각 DBMS는 고유의 ODBC 드라이버를 제공하고 응용 프로그램은 드라이버를 통해 DBMS를 액세스합니다. 예를 들어 윈도우 프로그램들은 그래픽 카드를 직접 액세스 하지 않고 설치된 드라이버를 통하므로 그래픽 카드가 바뀔 경우 드라이버만 교체하면 되는 것처럼 ODBC도 마찬가지로 DBMS를 바꾸더라도 드라이버만 교체하면 되므로 프로그램의 코드는 수정할 필요 없이 사용할 수 있습니다.
응용 프로그램 : 데이터를 액세스하는 프로그램
드라이버 관리자 : 응용 프로그램과 드라이버 사이에서 통신 역할을 담당. 응용 프로그램이 요구한 데이터 소스의 드라이버를 찾아 로드하는 일을 대신 한다.
드라이버 : 드라이버는 ODBC API 함수의 구현부를 가지는 실행 모듈(보통 DLL)이다.
데이터 소스 : 데이터 그 자체. 이 정보에는 사용할 드라이버, 데이터가 있는 네트워크 주소, 네트워크 소프트웨어 등등이 포함됨
ODBC가 정의한 이 타입들은 DBMS에 맞게 변환하는 것은 드라이버가 하는데 드라이버는 ODBC의 모든 타입을 다 지원할 필요는 없으며 DBMS와 대응되는 타입만 지원하면 됩니다.
C형 타입은 응용 프로그램에서 DB로부터 결과 셋을 돌려받을 때나 버퍼의 타입을 지정할 때 사용합니다. 이 표는 ODBC의 C데이터 타입 ID와 각 타입의 정의 및 대응되는 C언어의 데이터 타입입니다.
ODBC는 정보 저장을 위해 핸들을 사용합니다. 기존에 사용하던 HDC나 HWND같은 일반적인 핸들과 사용하는 목적과 방법은 동일합니다.
핸들을 할당할 때 사용하는 함수입니다. 첫 번째 인수로 핸들의 타입, 두 번째로 새 핸들이 포함될 부모핸들, 세 번째로 새로 만들어질 핸들의 번지가 기정됩니다.
SQLFreeHandle은 핸들 해제 함수로 핸들을 사용 하고 난 후에는 핸들을 해제해야 합니다. 첫 번째 인수로 핸들의 타입, 두 번째 인수로 해제 할 핸들을 지정합니다.
환경 핸들에는 환경의 현재 상태, 진단 정보, 환경의 속성, 연결에 대한 정보 등이 저장됩니다.
SQLAllocHandle의 첫 번째 인수로 핸들타입으로 환경을 주었고, 두 번째 인수로 부모핸들을 지정하는 곳에는 환경핸들은 어떤 핸들에도 포함되지 않아서 SQL_NULL_HANDLE을 지정했습니다. 세 번째 인수로 새로만들어질 환경의 번지로 환경핸들을 주었습니다.
SQLSetEnvAttr을 보면 환경핸들을 할당하고 이 핸들의 버전을 3.0으로 설정하였습니다.
여기에 쓰인 코드는 특별한 이유가 없으면 이대로 가져다 쓰면 되겠습니다.
연결핸들은 사용할 데이터 소스와 드라이버에 대한 정보를 가지며 연결 핸들에는 연결의 상태, 진단 정보, 명령 핸들과 설명자 핸들의 목록, 연결의 속성 등의 정보가 포함됩니다.
위 함수호출은 연결핸들 hDbc를 할당하고 hEnv 환경 안에 그 정보를 저장 합니다.
연결 핸들을 할당하고 난 후에 이 핸들을 사용하여 실제 데이터 소스와 연결합니다.
1번째 인수 : 할당한 연결 핸들
2번째 인수 : 메인 윈도우의 핸들
3번째 인수 : 연결 정보를 지정하는 연결 문자열
4번째 인수 : 연결 문자열의 길이
연결 문자열이란 데이터 소스에 연결하기 위한 정보를 가지는 문자열이며 일반적으로 일련의 키=값; 키의 종류는 드라이버마다 다름
첫 번째 인수로 연결핸들을 주고 두 번째 인수로 메인 윈도우 핸들 세 번째 인수로 연결정보를 지정할 문자열 네 번째 인수로 연결 문자열의 길이
연결을 한 다음에는 데이터를 액세스하기 위해 명령을 하는데 sql문을 사용합니다. 첫 번째 인수로 명령핸들, 두 번째 인수로 실행할 SQL문, 세 번째 인수의 경우 널 문자로 끝나는 경우 SQL_NTS로 지정해주면 됩니다.
빨간색코드가 SQL문입니다.
바인딩은 결과 셋을 컬럼과 변수를 연결하는 동작입니다. 결과 셋은 select문이 리턴 하는 레코드 집합입니다.
첫 번째 인수는 명령핸들, 두 번째 인수는 바인딩될 컬럼의 번호, 세 번째 인수는 바인딩되는 변수의 C형 데이터 타입, 네 번째 인수는 결과값을 저장할 버퍼
다섯 번째 인수는 버퍼의 길이, 마지막 인수는 컬럼의 길이나 상태를 리턴합니다.
SQLFetch 함수는 바인딩된 변수에 컬럼값을 대입하고 다음 로우셋으로 이동합니다. 따라서 밑에 예제처럼 SQL_NO_DATA를 리턴할 때까지 반복적으로 호출하면 결과셋의 모든 레코드를 읽을 수 있습니다.
SQLCloseCursor() 함수는 명령핸들에 열려진 커서를 닫고 결과셋을 모두 버리는 함수입니다. 사용한 명령핸들을 재사용하려면 이 함수를 먼저 호출하고 사용해야 합니다.
SQLFreeHandle() 함수는 할당한 핸들을 해제하는 함수인데 할당된 순서의 역순으로 해제해야 합니다.
SQLDisconnect() 함수는 데이터 소스와의 연결을 끊을 때 사용합니다.
예제를 보면 핸들을 할당할 때는 환경-연결-명령 순으로 할당했으므로 해제할 때는 명령-연결-환경 순으로 해제한 것을 알 수 있습니다.