ODBC (Open DataBaseConnectivity) 설 성 훈
※목차 ODBC의 정의 ODBC의 구조 ODBC의 구성 요소 ODBC의 핸들에 대해…(환경,연결,명령) 함수에 따른 각 예제들… 드라이버 생성하기
ODBC의 정의 ODBC는 DBMS를 다루는 드라이버와 응용 프래그램을 연결하는 인터페이스. 응용 프로그램은 ODBC함수를 호출하여 DBMS의 데이터에 엑세스하며, 중간의 드라이버를 교체하면 같은 코드로 다른 DBMS의 데이터에 접근 할 수 있음. 하나의 소스로 다른 DBMS에게 접근 하는 것. (참고, DBMS끼리는 서로 호환되지 않음, 그래서 응용 프로그램은 DBMS에 종속적임. 이를 해결하기 위해 ODBC가 시도됨)
ODBC의 구조 드라이버 A DBMS A 드라이버 B DBMS B 드라이버 관리자 응용 프로그램 각 DBMS는 고유의 ODBC 드라이버를 제공. 특정한 DBMS에 종속적이지 않고, 언어에도 무관하게 사용할 수 있음. DBMS A 드라이버 A DBMS B 드라이버 B 드라이버 관리자 응용 프로그램 DBMS C 드라이버 C DBMS D 드라이버 D
ODBC의 구성 요소 데이터 소스 응용 프로그램 데이터를 액세스하는 프로그램 드라이버 관리자 응용 프로그램과 드라이버 사이에서 통신 역할을 담당 응용 프로그램이 요구한 데이터 소스의 드라이버를 찾아 로드를 함. 드라이버 ODBC API 함수의 구현부를 가지는 실행 모듈(DLL) 데이터 소스 데이터에 엑세스 하기 위한 모든 정보들의 집합
ODBC 데이터 타입 SQL 타입 ID SQL 데이터 타입 SQL_CHAR CHAR SQL_VARCHAR VARCHAR SQL_DECIMAL DECIMAL SQL_SMALLINT SMALLINTEGER SQL_INTEGER INTGER SQL_BINARY BINARY SQL_TYPE_DATE DATE (DBMS와 대응되는 타입만 지원)
(응용프로그램에서 DB로부터 결과 셋을 돌려받을 때나 버퍼의 타입을 지정할 때 사용) C언어의 데이터 타입 C 타입 ID typedef C 데이터 타입 SQL_C_CHAR SQLCHAR* unsigned char* SQL_C_SSHORT SQLSMALLINT short int SQL_C_USHORT SQLUSMALLINT unsigned short int SQL_C_SLONG SQLINTEGER long int SQL_C_ULONG SQLUINTEGER unsigned long int SQL_C_FLOAT SQLREAD float SQL_C_DOUBLE SQLDOUBLE double SQL_C_BIT SQLSCHAR unsigned char SQL_C_BINARY SQL_C_BOOKMARK BOOKMARK SQL_C_TYPE_DATE SQL_DATE_STRUCT struct tagDATE)STRUCT{ SQLSMALLINT year; SQLUSMALLINT month; SQLUSMALLINT day; } DATE_STRUCT; (응용프로그램에서 DB로부터 결과 셋을 돌려받을 때나 버퍼의 타입을 지정할 때 사용)
ODBC 헤더파일 #include <sql.h> #include <sqlext.h> ODBC API함수들에 대한 원형,매크로 등이 선언되어 있음.
핸들 핸들 변수들 SQLRETURN SQLAllocHandle( //핸들 할당 함수 SQLHENV hEnv; //환경 SQLHDBC hDbc; //연결 SQLHSTMT hStmt; //명령 SQLHDESC hDes; //설명자 SQLRETURN SQLAllocHandle( //핸들 할당 함수 SQLSMALLINT HandleType, //할당하고자 하는 핸들의 타입 SQLHANDLE InputHandle, //새 핸들이 포함될 부모 핸들을 지정 SQLHANDLE* OutputHandlePtr //새로 만들어질 핸들의 번지를 지정하는 출력용 인수 ); -> 핸들 타입의 종류: SQL_HANDLE_ENV, SQL_HANDLE_DBC, SQL_HANDLE_STMT, SQL_HANDLE_DESC SQLRETURN SQLFreeHandle(SQLSMALLINT Handle Type, SQLHANDLE Handle); //핸들 해제 함수
환경 핸들 환경의 현재상태, 진단 정보, 환경의 속성, 연결에 대한 정보 등의 정보들이 저장되어 있음. 연결은 프로그램이 어떤 데이터에 소스에 연결되어 있는지에 대한 정보를 가지고, 연결들의 목록이 환경에 저장됨. 예제 SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv); SQLSetEnvAttr(hEnv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER); 1번째 인자: 환경핸들 2번째 인자: 설정하고자 하는 속성 3번째 인자: 속성 값 4번째 인자: 속성값의 길이
연결 핸들 연결: 사용할 데이터의 소스와 드라이버에 대한 정보 연결핸들: 연결의 상태, 진단 정보, 명령 핸들, 설명자 핸들의 목록, 연결의 속성 등의 정보가 포함 SQLAllocHandle(SQL_HANDLE_DBC, hEnv,&hDbc); 이 함수 호출로 연결 핸들을 할당시켜줌.
연결(실제 데이터 소스와 연결) SQLConnect, SQLDriverConnect, SQLBrowseconnect SQLRETURN SQLDriverConnect( SQLHDBC ConnectionHandle, //할당한 연결 핸들 SQLHWND WindowHandle, //메인 윈도우의 핸들 SQLCHAR *InconnectionString, //연결정보를 지정하는 연결 문자열 SQLSMALLINT StringLength1 , //연결 문자열의 길이 SQLCHAR *OutConnectionString, //함수가 실행 중에 구성한 연결 문자열을 돌려받기 위한 문자열의 버퍼 SQLSMALLINT BufferLength, //버퍼의 길이 SQLSMALLINT *StringLength2Ptr, //문자열 길이의 번지 SQLUSMALLINT DriverCompletion //드라이버 옵션 ); 5~8번째 인자는 정보가 불완전할 경우 사용자가 추가 정보를 대화상자로 요구하고 완성된 문자열을 리턴할 때 쓰인다. (참고) 연결문자열이란, 데이터 소스에 연결하기 위한 정보를 가지는 문자열
연결 예제 //함수 호출에 필요한 변수들 SQLCHAR InCon[255]; SQLCHAR OutCon[1024]; SQLSMALLINT cbOutCon; TCHAR Dir[MAX_PATH]; //MDB 파일에 연결하기 GetCurrentDirectory(MAX_PATH,Dir); wsprintf((TCHAR *)InCon,"DRIVER={Microsoft Access Driver (*.mdb)};DBQ=%s\\Girl.mdb;",Dir); SQLDriverConnect(hDbc,hDlgMain,InCon,sizeof(InCon),OutCon,sizeof(OutCon),&cbOutCon, SQL_DRIVER_NOPROMPT);
명령 핸들 SQLRETURN SQLExecDirect( SQLHSTMT StatementHandle, //명령핸들 SQLAllocHandle(SQL_HANDLE_STMT,hDbc,&hStmt); 명령 실행 (SQL문을 실행시켜줌) SQLRETURN SQLExecDirect( SQLHSTMT StatementHandle, //명령핸들 SQLCHAR* StatemnetText, //실행할 SQL문 SQLINTEGER TextLength //SQL문의 길이 ); SQLExecDirect(hStmt,(SQLCHAR *)"select name from girl",SQL_NTS);
명령 핸들 예 SQLExecDirect(hStmt,(SQLCHAR *)"select name from girl",SQL_NTS); "Delete from girl where name='%s'“ "Update girl set name='%s', where name='%s'"
바인딩 결과 셋의 컬럼과 변수를 연결하는 동작 결과 값을 돌려 받기 위해 사용됨. SQLRETURN SQLBindCol( 결과 셋(Result Set: Select문이 리턴 하는 레코드 집합) 결과 값을 돌려 받기 위해 사용됨. SQLRETURN SQLBindCol( SQLHSTMT StatementHandle, //명령 핸들 SQLUSMALLINT ColumnNumber, //바인딩 될 컬럼의 번호 SQLSMALLINT TargetType, // 바인딩 되는 변수의 데이터 타입 SQLPOINTER TargetValuePtr, // 저장할 버퍼 SQLINTEGER BufferLength, // 버퍼의 길이 SQLLEN* StrLen_or_lnd // 길이or 상태 값을 리턴 받을 변수의 번지 );
바인딩 예제 SQLINTEGER lName,lAge; //변수 SQLBindCol(hStmt,1,SQL_C_CHAR,Name,sizeof(Name),&lName); SQLBindCol(hStmt,2,SQL_C_ULONG,&Age,0,&lAge);
데이터 가져오기, 마무리 하기 SQLRETURN SQLFetch(SQLHSTMT StatementHandle); //명령핸들 SQL_NO_DATA 를 반복적으로 호출하면 결과 셋의 모든 레코드를 읽을 수 있음 마무리작업들.. SQLCLOSECURSOR(); //명령핸들에 열려진 커서를 닫고 결과셋을 모두 버리는 함수 (명령을 재사용하려면 반드시 결과셋을 먼저 버리고 재사용 해야함) SQLFreeHandle(); //할당된 핸들을 해제하는 함수 (할당된 순서의 역순으로 해제) SQLDisconnect(); //데이터 소스와의 연결을 끊음
예제 //읽어온 데이터 출력 if(SQLFetch(hStmt) != SQL_NO_DATA) { SetWindowText(hFName,(LPCTSTR)Name); wsprintf(szSQL,"%d",Age); SetWindowText(hAge,szSQL); } //핸들 할당 해제 하기 SQLFreeHandle(SQL_HANDLE_STMT,hStmt); SQLDisconnect(hDbc); SQLFreeHandle(SQL_HANDLE_DBC,hDbc); SQLFreeHandle(SQL_HANDLE_ENV,hEnv);
드라이버 생성하기 제어판 관리 도구데이터 원본 ODBC 클릭!
드라이버 생성하기(2)
드라이버 생성하기(3)
THE END