반응형

[c] C/C++ 에서 MySQL 연동하기 Sample (unixODBC 이용)

http://blog.junghun.com/220245681954


 

Driver Download

http://www.unixodbc.org/

 

 

설치

– 다운로드 받은 파일 (unixODBC-2.3.1.tar.gz) 의 압축을 푼다.

– 압축푼 경로로 이동.

– ./configure

– make

– make install

 


package install

CentOS 상에 설치하는 것 이라면… 위의 방법보단, 아래를 추천한다.

yum install mysql-connector-odbc

연관 패키지로, libtool-ltdl, unixODBC 가 설치 된다.

 

 

~/.odbc.ini 생성

 

 

 

 

[DEV_XXXX_MYSQL]

Driver          = MySQL

Description  = myodbc

Server         = IP

Port             = PORT

Database     = DATABASE

charset        = utf8

USER           = ID

PASSWORD  = PW
cs

 


/usr/local/etc/odbcinst.ini

 


odbcinst -j 를 했을 때, 나오는 DRIVERS 경로를 수정해 주어야 한다.

 

 

 

 

[MySQL]

Description = ODBC for MySQL

Driver = /usr/lib64/libmyodbc5.so

Setup = /usr/lib64/libodbcmyS.so

Driver64 = /usr/lib64/libmyodbc5.so

Setup64 = /usr/lib64/libodbcmyS.so
cs

 

 

 

ODBC 드라이버 테스트

 

 

 

 

 

Sample Code

 

 

 

 

#include <stdio.h>

#include <string.h>

 

#include <sql.h>

#include <sqlext.h>

 

int main() {

 

    SQLHENV     env;    // Handle ODBC enviroment

    SQLHDBC     dbc;    // Handle connection

    SQLHSTMT    stmt;   // Handle statement

    SQLLEN      err;

    SQLLEN      rowanz;

    SQLSMALLINT colanz;

 

    char        buffer[200];

    int         tmpMediaID;

    long        res;

 

    memset(buffer, 0x00, sizeof(buffer));

 

    /*

     * 환경, 연결, 그리고 명령문 핸들을 위한 메모리를 할당하고 초기화 한다.

     * http://blog.naver.com/PostView.nhn?blogId=tealeoni&logNo=120075598107&parentCategoryNo=77&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView

     */

    SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);

 

    /*

     * ODBC: Version: Set

     * (현재 환경에 대한 환경 속성을 설정한다.)

     * http://blog.naver.com/PostView.nhn?blogId=tealeoni&logNo=120075614956&parentCategoryNo=77&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView

     */

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

 

    // DBC: Allocate

    SQLAllocHandle( SQL_HANDLE_DBC, env, &dbc);

 

    /*

     * DB와의 연결을 설정한다.

     * http://blog.naver.com/PostView.nhn?blogId=tealeoni&logNo=120075600429&parentCategoryNo=77&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView

     */

    res = SQLConnect( dbc, (SQLCHAR*)"DATABASE", SQL_NTS,

                               (SQLCHAR*)"ID", SQL_NTS,

                               (SQLCHAR*)"PW", SQL_NTS);

 

    printf("접속결과 : %ld\n", res);

 

    /*

     * 명령핸들ID 할당.

     * https://kb.askmonty.org/en/sqlallochandlesql_handle_stmt/

     */

    SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);

 

    /*

     * 모든 데이터 타입에 대해 애플리케이션 변수들을 (application data buffers) 결과 집합의 열들에 바인드한다.

     * http://blog.naver.com/PostView.nhn?blogId=tealeoni&logNo=120075598934&redirect=Dlog&widgetTypeCall=true

     */

    SQLBindCol(stmt, 1 , SQL_C_LONG, &tmpMediaID, sizeof(tmpMediaID), &err);

    SQLBindCol(stmt, 2 , SQL_C_CHAR, buffer, sizeof(buffer), &err);

 

    /*

     * 주어진 SQL 문장을 직접 실행

     * http://blog.naver.com/PostView.nhn?blogId=tealeoni&logNo=120075604687&parentCategoryNo=77&viewDate=&currentPage=1&listtype=0

     */

    SQLExecDirect(stmt, (SQLCHAR *)"SELECT MEDIAID, MEDIANAME FROM DAWIN.TMEDIA", SQL_NTS);

 

    /*

     * 결과 집합의 열의 개수를 반환한다.

     * http://blog.naver.com/PostView.nhn?blogId=tealeoni&logNo=120075611803&parentCategoryNo=77&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView

     */

    SQLNumResultCols(stmt, &colanz);

    printf("컬럼 수 : %d\n", colanz);

 

    /*

     * Row 수 확인.

     * http://blog.naver.com/PostView.nhn?blogId=tealeoni&logNo=120075614455&parentCategoryNo=77&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView

     */

    SQLRowCount(stmt, &rowanz);

    printf("로우 수 : %ld\n", rowanz);

 

    /*

     * 결과 집합의 다음 행으로 커서를 진행시키고 바인드된 열을 가져온다.

     * http://blog.naver.com/PostView.nhn?blogId=tealeoni&logNo=120075605741&parentCategoryNo=77&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView

     */

    while(SQLFetch(stmt) != SQL_NO_DATA)

    {

        printf("Result: %d, %s\n", tmpMediaID, buffer);

    }

 

    /*

     * 특정한 환경, 연결, 그리고 명령문 핸들과 관련된 자원들을 해제한다.

     * http://blog.naver.com/PostView.nhn?blogId=tealeoni&logNo=120075608317&parentCategoryNo=77&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView

     */

    SQLFreeHandle(SQL_HANDLE_STMT, stmt);

 

    /*

     * 특정 연결 핸들과 관련된 연결을 종료한다.

     * http://blog.naver.com/PostView.nhn?blogId=tealeoni&logNo=120075602527&parentCategoryNo=77&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView

     */

    SQLDisconnect( dbc );

    SQLFreeHandle( SQL_HANDLE_DBC, dbc );

    SQLFreeHandle( SQL_HANDLE_ENV, env );

 

    printf("\n");

    return 0;

}


Compile

cc -o DB_Test DB_Test.c -lodbc

 

반응형
Posted by 공간사랑
,