ODBC

Retired DISLab
Swpark (토론 | 기여) 사용자의 2014년 1월 26일 (일) 01:04 버전
(비교) ← 이전 판 | 현재 판 (비교) | 다음 판 → (비교)
이동: 둘러보기, 찾기

목차

Access 데이터베이스를 위한 ODBC 드라이버 만들기

Access 데이터베이스 생성하기

1. Microsoft Access를 실행한 후 새 데이터베이스를 선택하여 새로운 데이터베이스를 생성한다. 아래 예제는 새 데이터베이스의 이름으로 Bank를 선택한 것이다.


Access 첫화면.png


2. 데이터베이스를 생성한 화면이다.


Access Bank 데이터베이스 생성.png


3. Access 2007로 데이터베이스를 생성하였다면 mdb 파일을 만들기 위하여 메뉴에서 다른 이름으로 저장을 선택한 후 Access 2002-2003 데이터베이스를 선택하여 mdb 파일을 생성한다.


Access 다른이름으로저장.png


Windows XP에서 ODBC 설정

1. 제어판 / 관리도구 / 데이터 원본 (ODBC)을 선택하여 ODBC 데이터 원본 관리자를 띄운다.


ODBC 데이터 원본 관리자.png


2. 추가(D)를 선택하여 새 데이터 원본 만들기를 띄워 Microsoft Access Driver (*.mdb)를 선택한 후 마침 버튼을 누른다.


새 데이터 원본 만들기.png


3. 새로운 ODBC 설정을 만든다. 아래 예제에서는 데이터 원본 이름을 mybank로 주었다. 그런 다음 데이터베이스를 선택 버튼을 눌러 선택한다.


ODBC Microsoft Access 설정.png


4. 앞에서 만든 Bank.mdb 파일을 선택한다.


데이터베이스를 선택하십시오.png


5. ODBC 데이터 생성 모습

ODBC 데이터 원본 관리자 생성후.png


Visual C++ 2008을 이용한 ODBC 응용 프로그램 작성

1. Project를 생성한다. (ODBCApp)

// ODBCApp.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//
 
#include "stdafx.h"
#include <windows.h>
#include <sqlext.h>
 
void connect(SQLHENV* henv, SQLHDBC* hdbc);
void createSchema(SQLHDBC hdbc);
void insertCustomers(SQLHDBC hdbc);
void retrieveCustomers(SQLHDBC hdbc);
void dropTables(SQLHDBC hdbc);
 
int _tmain(int argc, _TCHAR* argv[])
{
    SQLHENV henv;
    SQLHDBC hdbc;
 
    connect(&henv, &hdbc);
 
    createSchema(hdbc);
 
    insertCustomers(hdbc);
 
    retrieveCustomers(hdbc);
 
    dropTables(hdbc);
 
    SQLDisconnect(hdbc);
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
 
    getchar();
    return 0;
}
 
void connect(SQLHENV* henv, SQLHDBC* hdbc)
{
    SQLRETURN retcode;
    wchar_t szDSN[SQL_MAX_DSN_LENGTH] = _T("mybank");
    SQLPOINTER rgbValue;
    int i = 5;
    rgbValue = &i;
 
    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, henv);
 
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
        retcode = SQLSetEnvAttr(*henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); 
 
        if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
            retcode = SQLAllocHandle(SQL_HANDLE_DBC, *henv, hdbc); 
 
            if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
                SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)(rgbValue), 0);
 
                retcode = SQLConnect(*hdbc, (SQLWCHAR*)szDSN, SQL_NTS, (SQLWCHAR*)NULL, 0, (SQLWCHAR*)NULL, 0);
 
                if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
                    return; // Connect 성공
                }
            }
        }
        SQLFreeHandle(SQL_HANDLE_ENV, *henv);
    }
    exit(1);	// Connect 실패
}
 
void createSchema(SQLHDBC hdbc)
{
    HSTMT	hstmt;
    SQLRETURN retcode;
 
    wchar_t customer_schema[] = _T("CREATE TABLE customer ( customer_name CHAR(20), customer_street VARCHAR(30), customer_city VARCHAR(20), PRIMARY KEY(customer_name));");
 
    wchar_t branch_schema[] = _T("CREATE TABLE branch (branch_name CHAR(15), branch_city VARCHAR(30), assets INTEGER, PRIMARY KEY(branch_name));");
 
    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 
    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
        exit(1);
    }
 
    retcode = SQLExecDirect(hstmt, customer_schema, SQL_NTS); 
    if (retcode < 0) {
        printf("Error : %d\n", retcode);
    }
 
    retcode = SQLExecDirect(hstmt, branch_schema, SQL_NTS); 
    if (retcode < 0) {
        printf("Error : %d\n", retcode);
    }
 
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
}
 
void insertCustomers(SQLHDBC hdbc)
{
    HSTMT	hstmt;
    SQLRETURN retcode;
 
    wchar_t* queries[] = {
            _T("INSERT INTO customer VALUES('Adams', 'Spring', 'Pittsfield');"),
            _T("INSERT INTO customer VALUES('Brooks', 'Senator', 'Brooklyn');"),
            _T("INSERT INTO customer VALUES('Curry', 'North', 'Rye');"),
            _T("INSERT INTO customer VALUES('Glenn', 'Sand Hill', 'Woodside');"),
            _T("INSERT INTO customer VALUES('Green', 'Walnut', 'Stamford');"),
            _T("INSERT INTO customer VALUES('Hayes', 'Main', 'Harrison');"),
            _T("INSERT INTO customer VALUES('Johnson', 'Alma', 'Palo Alto');"),
            _T("INSERT INTO customer VALUES('Jones', 'MAIN', 'Harrison');"),
            _T("INSERT INTO customer VALUES('Lindsay', 'Park', 'Pittsfield');"),
            _T("INSERT INTO customer VALUES('Smith', 'North', 'Rye');"),
            _T("INSERT INTO customer VALUES('Turner', 'Puthnam', 'Stamford');"),
            _T("INSERT INTO customer VALUES('Williams', 'Nassau', 'Princeton');") };
 
    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 
    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
        exit(1);
    }
 
    int no = sizeof(queries) / sizeof(wchar_t*);
    for(int i = 0; i < no; i++) {
        retcode = SQLExecDirect(hstmt, queries[i], SQL_NTS); 
        if (retcode < 0) {
            printf("Error : %d, %d\n", i, retcode);
        }
    }
 
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
}
 
void retrieveCustomers(SQLHDBC hdbc)
{
    HSTMT	hstmt;
    SQLRETURN retcode;
    char	name[40];
    char	street[40];
    char	city[40];
    SQLINTEGER	lenOut1, lenOut2, lenOut3;
 
    wchar_t query[] = _T("SELECT * FROM customer;");
 
    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 
    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
        exit(1);
    }
 
    retcode = SQLExecDirect(hstmt, query, SQL_NTS); 
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
        SQLBindCol(hstmt, 1, SQL_C_CHAR, name, 40, &lenOut1);
        SQLBindCol(hstmt, 2, SQL_C_CHAR, street, 40, &lenOut2);
        SQLBindCol(hstmt, 3, SQL_C_CHAR, city, 40, &lenOut3);
 
        while (SQLFetch(hstmt) == SQL_SUCCESS) {
            printf("%s\t%s\t%s\n", name, street, city);
        }
    }
 
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
}
 
void dropTables(SQLHDBC hdbc)
{
    HSTMT	hstmt;
    SQLRETURN retcode;
 
    wchar_t customer_schema[] = _T("DROP TABLE customer;");
 
    wchar_t branch_schema[] = _T("DROP TABLE branch;");
 
    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 
    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
        exit(1);
    }
 
    retcode = SQLExecDirect(hstmt, customer_schema, SQL_NTS); 
    if (retcode < 0) {
        printf("Error : %d\n", retcode);
    }
 
    retcode = SQLExecDirect(hstmt, branch_schema, SQL_NTS); 
    if (retcode < 0) {
        printf("Error : %d\n", retcode);
    }
 
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
}
개인 도구
이름공간
변수
행위
둘러보기
구성원
연구
연구실
기타
도구모음
인쇄/내보내기