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 샘플 코드










