Background Image
조회 수 23644 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

ODBC드라이버를 이용한 2개 이상의 Statement 사용방법

.소개: 본 문서는 CUBRID 2008 ODBC 드라이버와 Visual Studio에서 win API를 이용하여 하나의 Connection에서 두개 이상의 Statement를 사용하는 방법을 설명합니다.

2009-06-10 고객지원팀, 권성준CUBRID

적용 대상: CUBRID2008 R1.4(windows)

적용 환경

본 문서는 아래와 같은 환경에서 적용 되었습니다.

큐브리드 2008이상

window XP Visual Studio 6.0 Enterprise

 

개요

CUBRID 2008 AutoCommit default 값으로 ON으로 되어 있습니다. 영향으로 하나의 Connection에서 여러 개의 Statement 사용을 원하는 경우에, 하나의 Statement close되면 나머지 다른 Statement close 됩니다. 이러한 현상을 미연에 방지하기 위한 방법으로 AutoCommit OFF 설정하여 사용하는 방법을 소개합니다.


ODBC 드라이버 설정

시작 -> 제어판 -> 관리도구 -> 데이터 원본(ODBC)
추가를 클릭


CUBRID Drive 선택하고 마침을 클릭.


아래와 같이 값을 입력하고 OK 클릭.

 

샘플 코드 작성

#include <stdio.h>

#include <windows.h>

#include <sql.h>

#include <sqlext.h>

#include <sqltypes.h>

 

#define char_len 30

#define MAX 255

 

void prepare_test(SQLHDBC hOdbc);

 

int main(){

             SQLHENV hEnv;

             SQLHDBC hOdbc;

             SQLCHAR sqlState[char_len], pMsg[MAX];

             long state;

             SQLINTEGER NativeError;

             SQLSMALLINT BufferLength;

             TCHAR *UserID= "dba";

             TCHAR *UserPWD= "";

            

             SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);

             SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

             SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hOdbc);

 

             state = SQLConnect(hOdbc,(SQLCHAR *)"CUBRID",SQL_NTS,(SQLCHAR *)UserID,SQL_NTS,(SQLCHAR *)UserPWD,SQL_NTS);

 

             if ((state != SQL_SUCCESS) && (state != SQL_SUCCESS_WITH_INFO)){

                           printf("Error SQLConnect %ldn", state);

                           SQLGetDiagRec(SQL_HANDLE_DBC, hOdbc, 1, sqlState, &NativeError, pMsg, MAX, &BufferLength);

                           printf("%s (%d)n", pMsg, (int)NativeError);

                           SQLFreeHandle(SQL_HANDLE_DBC, &hOdbc);

                           SQLFreeHandle(SQL_HANDLE_ENV, &hEnv);

                           exit(1);

             }

 

             SQLSetConnectAttr(hOdbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, SQL_IS_UINTEGER);

 

             prepare_test(hOdbc);

             SQLDisconnect(hOdbc);

             SQLFreeHandle(SQL_HANDLE_DBC, &hOdbc);

             SQLFreeHandle(SQL_HANDLE_ENV, &hEnv);

             return 0;

}

 

void prepare_test(SQLHDBC hOdbc){

             SQLHSTMT hStmt1, hStmt2, hStmt3;

             SQLINTEGER NativeError;

             TCHAR result1[char_len];

             char *sql1 = "SELECT name FROM athlete WHERE nation_code = 'KOR'";

             char *sql2 = "INSERT INTO test_class VALUES(?)";

             char *sql3 = "CREATE CLASS test_class (test_col STRING)";

 

             SQLAllocHandle(SQL_HANDLE_STMT, hOdbc, &hStmt1);

             SQLAllocHandle(SQL_HANDLE_STMT, hOdbc, &hStmt2);

             SQLAllocHandle(SQL_HANDLE_STMT, hOdbc, &hStmt3);

 

             if(SQLExecDirect(hStmt3, (SQLCHAR *)sql3, SQL_NTS) != SQL_SUCCESS){

                           printf("Execute Error(%s).n", sql3);

                           exit(1);

             }            

 

             SQLBindCol(hStmt1, 1, SQL_C_CHAR, result1, sizeof(result1), &NativeError);

             if(SQLExecDirect(hStmt1, (SQLCHAR *)sql1, SQL_NTS) != SQL_SUCCESS){

                           printf("Execute Error(%s).n", sql1);

                           exit(1);

             }

 

             if(SQLPrepare(hStmt2, (SQLCHAR *)sql2, SQL_NTS) != SQL_SUCCESS){

                           printf("Prepare Error.n");

                           exit(1);

             }

 

             while (SQLFetch(hStmt1) != SQL_NO_DATA){

                           if(SQLBindParameter(hStmt2, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, char_len-1, 0, result1, 0, NULL) != SQL_SUCCESS){

                                        printf("Biniding Error.n");

                                        exit(1);

                           }

                           if(SQLExecute(hStmt2) != SQL_SUCCESS){

                                        printf("Execute Error.n");

                                        exit(1);

                           }            

             }

 

             printf("실행 종료.n");

             SQLEndTran(SQL_HANDLE_DBC, hOdbc, SQL_COMMIT);

             SQLFreeStmt(hStmt1, SQL_CLOSE);

             SQLFreeStmt(hStmt2, SQL_CLOSE);

             SQLFreeHandle(SQL_HANDLE_STMT, &hStmt1);

             SQLFreeHandle(SQL_HANDLE_STMT, &hStmt2);

}

 

소스코드 설명

ODBC 드라이버를 이용하여, 이상의 Statement 사용하는 방법은 다음과 같습니다.

1.      SQLConnect API 이용하여 DB 연결하여 Connection 생성.
(
연결핸들과 DNS, UserID, UserPW 필요하며, SQL_NTS NULL 끝나는 문자열의 길이를 의미.)

2.      SQLSetConnectAttr API 통해 SQL_ATTR_AUTOCOMMIT 값을 SQL_AUTOCOMMIT_OFF 설정.
(
연결핸들과 설정 속성, 속성의 포인터 값이 필요.)

3.      SQLPrepare API SQLBindParameter 이용한 prepare 작업 수행.(SQLExecute에만 해당)
(sql
문의 핸들, 바인딩의 순서, 매개변수의 Input/Output 방식, 매개변수의 C 데이터 타입, 매개변수의 sql 데이터 타입, 바인딩 값의 크기, 데이터 타입에 따른 소수점 아래의 자리수, 매개변수의 포인터가 필요하다.)

4.      SQLExecDirect 또는 SQLExecute API 이용하여 질의 수행.
(sql
문의 핸들, sql문이 필요.)

5.      SQLEndTran 이용하여 COMMIT 또는 ROLLBACK으로 Connection 종료.
(
핸들의 타입, 연결핸들, SQL_COMMIT 또는 SQL_ROLLBACK 필요.)


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
66 Windows CUBRID2008R2.0 Windows BACKUP 자동화 설정하기 정만영 2009.08.17 27942
65 Linux CUBRID2008R1.x to 2.0 마이그레이션 가이드 (32bit 기준) 정만영 2009.08.17 27205
64 기타 CUBRID2008 쿼리 작성예제 cubebridge 2009.07.28 24906
63 기타 CUBRID2008 실행계획 분석하기 file cubebridge 2009.07.28 15339
62 Install CUBRID2008 R2.1 업그레이드시 serial 관련 문제 해결 방법 남재우 2010.01.28 27348
61 기타 CUBRID2008 R2.0 실행계획 분석하기 file cubebridge 2009.08.27 21917
60 Windows CUBRID2008 R2.0 Tutorial (Windows) cubebridge 2009.08.17 27340
59 기타 CUBRID 활용 - 질의 튜닝 사례 중심 file cubrid 2010.12.02 45962
58 기타 CUBRID 주요 명령 요약 정리 정만영 2009.08.17 17187
57 Install CUBRID 에 텍스트큐브 설치하기 file inureyes 2009.12.31 29852
56 기타 CUBRID 스캔 이해하기 손승일 2009.08.15 15116
55 튜닝 CUBRID 세미나 자료(개요 및 SQL 활용) file admin 2011.07.14 22771
54 Install CUBRID 설치 안내 - LINUX 남재우 2011.03.08 30415
53 Install CUBRID 설치 및 매니저 구동하기(CUBRID 2008 R2.0) CUBRID_DEV 2009.08.18 30054
52 Install CUBRID 설치 및 매니저 구동하기(CUBRID 2008 R1.x) CUBRID_DEV 2009.07.18 31533
51 Linux CUBRID 사용 포트와 iptables(방화벽) 설정 정만영 2010.03.01 38342
50 기타 CUBRID 볼륨 공간 재사용률 비교 - 2008 R3.1 vs. 2008 R4.0 file admin 2011.07.14 16555
49 Linux CUBRID 복제 설계 가이드 file 정만영 2010.03.03 25139
48 기타 CUBRID 복제 구성하기 - 단일 서버에 구성 방법 포함 남재우 2010.03.08 30004
47 기타 CUBRID 매니저 R3.1에서 웹호스팅 서버의 CUBRID R2.1 접속하는 방법 (큐브리드 매니저에서 다른 버전의 큐브리드 서버 접속 방법) file admin 2011.07.14 31509
Board Pagination Prev 1 2 3 4 5 6 7 8 9 Next
/ 9

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2113 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales