ODBC 프로그래밍
1. 참고링크
•Open_Database_Connectivity - http://en.wikipedia.org/wiki/Open_Database_Connectivity
•Microsoft Open Database Connectivity (ODBC) - http://msdn2.microsoft.com/en-us/library/ms710252.aspx
•ODBC Programmer's Reference - http://msdn2.microsoft.com/en-us/library/ms714177.aspx
•ODBC API Reference - http://msdn2.microsoft.com/en-us/library/ms714562.aspx
•C Data Types - http://msdn2.microsoft.com/en-us/library/ms714556.aspx
•ODBC Technical Articles
•OLE DB for the ODBC Programmer - http://msdn2.microsoft.com/en-us/library/ms810892.aspx
•Using ODBC with Microsoft SQL Server - http://msdn2.microsoft.com/en-us/library/ms811006.aspx
•ODBC 함수 요약 정리 http://synch3d.com/wiki/moin/moin.cgi/ODBC
2. ODBC 관련 데이터 타입
SQL 타입 ID |
SQL 데이터 타입 |
C 타입 ID |
ODBC C typedef |
C 데이터 타입 |
SQL_CHAR |
CHAR(n) |
SQL_C_CHAR |
SQLCHAR * |
unsigned char * |
SQL_VARCHAR |
VARCHAR(n) |
SQL_C_CHAR | ||
SQL_WCHAR |
WCHAR(n) |
SQL_C_WCHAR |
SQLWCHAR * |
wchar_t * |
SQL_WVARCHAR |
VARWCHAR(n) |
SQL_C_WCHAR | ||
SQL_C_TCHAR |
SQLTCHAR * |
|||
SQL_BIGINT |
BIGINT |
SQL_C_SBIGINT |
SQLBIGINT |
_ _int64 |
SQL_INTEGER |
INTEGER |
SQL_C_SLONG |
SQLINTEGER |
long int |
SQL_SMALLINT |
SMALLINT |
SQL_C_SSHORT |
SQLSMALLINT |
short int |
SQL_TINYINT |
TINYINT |
SQL_C_UTINYINT |
SQLCHAR |
unsigned char |
SQL_REAL |
REAL |
SQL_C_FLOAT |
SQLREAL |
float |
SQL_FLOAT |
FLOAT(p) |
SQL_C_DOUBLE |
SQLFLOAT |
double |
SQL_DOUBLE |
DOUBLE |
SQLDOUBLE | ||
SQL_BINARY |
BINARY(n) |
SQL_C_BINARY |
SQLCHAR * |
unsigned char * |
SQL_VARBINARY |
VARBINARY(n) |
SQL_C_BINARY | ||
SQL_TYPE_DATE |
DATE |
SQL_C_TYPE_DATE |
SQL_DATE_STRUCT |
struct tagDATE_STRUCT |
SQL_TYPE_TIME |
TIME(p) |
SQL_C_TYPE_TIME |
SQL_TIME_STRUCT |
struct tagTIME_STRUCT |
SQL_TYPE_TIMESTAMP |
TIMESTAMP(p) |
SQL_C_TYPE_TIMESTAMP |
SQL_TIMESTAMP_STRUCT |
struct tagTIMESTAMP_STRUCT |
날짜/시간의 C 데이터 타입 구조
typedef struct tagDATE_STRUCT
{
SQLSMALLINT year;
SQLUSMALLINT month;
SQLUSMALLINT day;
} DATE_STRUCT;
typedef struct tagTIME_STRUCT
{
SQLUSMALLINT hour;
SQLUSMALLINT minute;
SQLUSMALLINT second;
} TIME_STRUCT;
typedef struct tagTIMESTAMP_STRUCT
{
SQLSMALLINT year;
SQLUSMALLINT month;
SQLUSMALLINT day;
SQLUSMALLINT hour;
SQLUSMALLINT minute;
SQLUSMALLINT second;
SQLUINTEGER fraction;
} TIMESTAMP_STRUCT;
3. ODBC API 주요 함수
3.1. ODBC 핸들
•SQL_HANDLE_ENV
•SQL_HANDLE_DBC
•SQL_HANDLE_STMT
•SQL_HANDLE_DESC
SQLRETURN SQLAllocHandle(
SQLSMALLINT HandleType, // 핸들 타입 (
SQLHANDLE InputHandle, // 새로 만들어질 핸들의 부모 핸들.
SQLHANDLE * OutputHandlePtr // 새로 만들어질 핸들을 저장할 핸들 변수의 주소.
);
SQLRETURN SQLFreeHandle(
SQLSMALLINT HandleType,
SQLHANDLE Handle
);
3.2. ODBC 연결
// Local DB/File 연결 함수
SQLRETURN SQLDriverConnect(
SQLHDBC ConnectionHandle, // DB 연결 핸들
SQLHWND WindowHandle, // 윈도우 핸들 (사용안함)
SQLCHAR * InConnectionString, // 전체/부분 연결 문자열(파일 지정)
SQLSMALLINT StringLength1, // 연결 문자열의 길이
SQLCHAR * OutConnectionString, // 연결 완료된 문자열
SQLSMALLINT BufferLength, // 연결 완료된 문자열의 크기 (할당된 크기: 최소 1024)
SQLSMALLINT * StringLength2Ptr, // 연결 완료된 문자열의 길이 (반환값)
SQLUSMALLINT DriverCompletion // 연결 옵션 (주로 SQL_DRIVER_NOPROMPT 사용)
);
3.3. 쿼리 실행
// SQL Query 즉시 실행 함수 (SQL 문 준비 과정 없음)
SQLRETURN SQLExecDirect(
SQLHSTMT StatementHandle, // SQL 명령문 핸들
SQLCHAR * StatementText, // 실행될 SQL 문
SQLINTEGER TextLength // 실행될 SQL 문의 길이
);
// SQL 문에 대한 다음 결과 값을 가져오는 함수
SQLRETURN SQLFetch(
SQLHSTMT StatementHandle // SQL 명령문 핸들
);
3.3.1. 정적 바인딩
// 결과 값의 열을 바인딩하는 함수
SQLRETURN SQLBindCol(
SQLHSTMT StatementHandle, // SQL 명령문 핸들
SQLUSMALLINT ColumnNumber, // 열 값의 순서 (1부터 시작)
SQLSMALLINT TargetType, // 열 값의 데이터형 (C Data Type)
SQLPOINTER TargetValuePtr, // 바인딩될 변수
SQLINTEGER BufferLength, // 바인딩될 변수의 크기 (고정길이형(정수형,논리형):0)
SQLLEN * StrLen_or_Ind // 열 값의 길이/상태값을 반환 받을 변수
);
3.3.2. 동적 바인딩
SQLRETURN SQLMoreResults(
SQLHSTMT StatementHandle // SQL 명령문 핸들
);
SQLRETURN SQLGetData(
SQLHSTMT StatementHandle, // SQL 명령문 핸들
SQLUSMALLINT ColumnNumber, // 열 값의 순서 (1부터 시작)
SQLSMALLINT TargetType, // 열 값의 데이터형 (C Data Type)
SQLPOINTER TargetValuePtr, // 바인딩될 변수
SQLLEN BufferLength, // 바인딩될 변수의 크기 (고정길이형(정수형,논리형):0)
SQLLEN * StrLen_or_IndPtr // 열 값의 길이/상태값을 반환 받을 변수
);
3.4. ODBC 연결 종료
SQLRETURN SQLCloseCursor(
SQLHSTMT StatementHandle
);
SQLRETURN SQLDisconnect(
SQLHDBC ConnectionHandle
);
SQLRETURN SQLFreeHandle(
SQLSMALLINT HandleType,
SQLHANDLE Handle
);
SQLCloseCursor( hStmt ); // STEP 1
SQLFreeHandle( SQL_HANDLE_STMT, hStmt ); // STEP 2
SQLDisconnect( hDBC ); // STEP 3
SQLFreeHandle( SQL_HANDLE_DBC, hDBC ); // STEP 4
SQLFreeHandle( SQL_HANDLE_ENV, hENV ); // STEP 5
4. ODBC 고급
4.1. ODBC 확장열 사용
구분 |
확장열 |
설명 | |
날짜 |
날짜 |
{d 'yyyy-mm-dd'} |
|
시간 |
{t 'hh:mm:ss'} |
||
타임 스탬프 |
{ts 'yyyy-mm-dd hh:mm:ss[.f]'} |
||
함수 |
{fn 함수명(인수)} |
||
ESCAPE 문자 |
{escape '문자'} |
||
프로시저 |
{[?=]call 프로시저(인수)} |
4.2. SQL 최적화 (준비: Prepare)
SQLRETURN SQLPrepare(
SQLHSTMT StatementHandle,
SQLCHAR * StatementText,
SQLINTEGER TextLength
);
SQLRETURN SQLExecute(
SQLHSTMT StatementHandle
);
4.3. 파라미터 사용
// 매개변수를 바인딩하는 함수
SQLRETURN SQLBindParameter(
SQLHSTMT StatementHandle, // SQL 명령문 핸들
SQLUSMALLINT ParameterNumber, // 매개변수의 순서 (1부터 시작)
SQLSMALLINT InputOutputType, // 매개변수의 용도 (입력/출력/입출력)
SQLSMALLINT ValueType, // 매개변수의 데이터형 (C Data Type)
SQLSMALLINT ParameterType, // 매개변수의 데이터형 (SQL data type )
SQLUINTEGER ColumnSize, // 매개변수의 크기
SQLSMALLINT DecimalDigits, // 매개변수의 자리 수 (정수형일 경우)
SQLPOINTER ParameterValuePtr, // 매개변수에 바인딩될 변수
SQLINTEGER BufferLength, // 매개변수에 바인딩될 변수의 크기 (문자열,이진데이터 크기)
SQLINTEGER * StrLen_or_IndPtr // 매개변수의 길이/상태값을 반환 받을 변수
);
4.4. ODBC 진단 정보
에러 |
실제값 |
설명 |
상태 |
SQL_SUCCESS |
0 |
함수 호출 성공. |
성공 |
SQL_SUCCESS_WITH_INFO |
1 |
함수 호출 성공 & 경고 발생. |
정상 / 심각 |
SQL_ERROR |
-1 |
일반적인 오류 발생. |
심각 |
SQL_INVALID_HANDLE |
-2 |
핸들 오류 발생. |
심각 |
SQL_NO_DATA |
100 |
읽을 데이터 없음. 일반적으로 EOF 상태. |
정상 |
SQL_NEED_DATA |
99 |
추가 정보 필요. |
선택 |
SQL_STILL_EXECUTING |
2 |
비동기 실행중인 상태. |
정상 |
SQLRETURN SQLGetDiagRec(
SQLSMALLINT HandleType,
SQLHANDLE Handle,
SQLSMALLINT RecNumber,
SQLCHAR * Sqlstate,
SQLINTEGER * NativeErrorPtr,
SQLCHAR * MessageText,
SQLSMALLINT BufferLength,
SQLSMALLINT * TextLengthPtr
);
4.5. 스키마(Schema) 정보
SQLColumns() - returns the list of column names in specified tables. The driver returns this information as a result set on the specified StatementHandle.
SQLRETURN SQLColumns(
SQLHSTMT StatementHandle,
SQLCHAR * CatalogName,
SQLSMALLINT NameLength1,
SQLCHAR * SchemaName,
SQLSMALLINT NameLength2,
SQLCHAR * TableName,
SQLSMALLINT NameLength3,
SQLCHAR * ColumnName,
SQLSMALLINT NameLength4
);
SQLTables() - returns the list of table, catalog, or schema names, and table types, stored in a specific data source. The driver returns the information as a result set.
SQLRETURN SQLTables(
SQLHSTMT StatementHandle,
SQLCHAR * CatalogName,
SQLSMALLINT NameLength1,
SQLCHAR * SchemaName,
SQLSMALLINT NameLength2,
SQLCHAR * TableName,
SQLSMALLINT NameLength3,
SQLCHAR * TableType,
SQLSMALLINT NameLength4
);
SQLProcedures() - returns the list of procedure names stored in a specific data source. Procedure is a generic term used to describe an executable object, or a named entity that can be invoked using input and output parameters. For more information on procedures, see the Procedures.
SQLRETURN SQLProcedures(
SQLHSTMT StatementHandle,
SQLCHAR * CatalogName,
SQLSMALLINT NameLength1,
SQLCHAR * SchemaName,
SQLSMALLINT NameLength2,
SQLCHAR * ProcName,
SQLSMALLINT NameLength3
);
SQLProcedureColumns() - returns the list of input and output parameters, as well as the columns that make up the result set for the specified procedures. The driver returns the information as a result set on the specified statement.
SQLRETURN SQLProcedureColumns(
SQLHSTMT StatementHandle,
SQLCHAR * CatalogName,
SQLSMALLINT NameLength1,
SQLCHAR * SchemaName,
SQLSMALLINT NameLength2,
SQLCHAR * ProcName,
SQLSMALLINT NameLength3,
SQLCHAR * ColumnName,
SQLSMALLINT NameLength4
);
5. ODBC 샘플 코드