'programming'에 해당되는 글 387건

  1. 2017.08.03 ODBC 프로그래밍

반응형

 

 

ODBC 프로그래밍

http://www.viper.pe.kr/cgi-bin/moin.cgi/ODBC_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

 


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

 

 

 

반응형
Posted by 공간사랑
,