ODBC
Retired DISLab
목차 |
Access 데이터베이스를 위한 ODBC 드라이버 만들기
Access 데이터베이스 생성하기
1. Microsoft Access를 실행한 후 새 데이터베이스를 선택하여 새로운 데이터베이스를 생성한다. 아래 예제는 새 데이터베이스의 이름으로 Bank를 선택한 것이다.
2. 데이터베이스를 생성한 화면이다.
3. Access 2007로 데이터베이스를 생성하였다면 mdb 파일을 만들기 위하여 메뉴에서 다른 이름으로 저장을 선택한 후 Access 2002-2003 데이터베이스를 선택하여 mdb 파일을 생성한다.
Windows XP에서 ODBC 설정
1. 제어판 / 관리도구 / 데이터 원본 (ODBC)을 선택하여 ODBC 데이터 원본 관리자를 띄운다.
2. 추가(D)를 선택하여 새 데이터 원본 만들기를 띄워 Microsoft Access Driver (*.mdb)를 선택한 후 마침 버튼을 누른다.
3. 새로운 ODBC 설정을 만든다. 아래 예제에서는 데이터 원본 이름을 mybank로 주었다. 그런 다음 데이터베이스를 선택 버튼을 눌러 선택한다.
4. 앞에서 만든 Bank.mdb 파일을 선택한다.
5. ODBC 데이터 생성 모습
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); }