수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1693892
  • Today | 243
  • Yesterday | 588

1 Articles, Search for 'DB'

  1. 2007/01/09 DB 작업을 보다 쉽게 해보자...(OTL 소개) (2)
Programming/Database Programming2007/01/09 09:06

DB 작업을 보다 쉽게 해보자...(OTL 소개)

고수닷넷 - snaiper님

OTL(Oracle, Odbc and DB2-CLI Template Library) 소개


이 라이브러리는 Oracle Call Interface 즉 OCI 를 쉽게 호출하기 위해 만들어졌으나, 그 외에 많은 발전을 거듭하여 이제는 ODBC, DB2-CLI 까지 지원하도록 설계되어 있습니다.즉 바꿔말하면 거의 모든 DB를 지원한다고 봐도 무방하다고 할 수 있겠습니다. 개인적으로 써 본 바로는 성능도 맘에 들고, 풀링도 가능한데다 SP(Stored Procedure) 콜도 꽤나 쉽고 간단합니다. 물론 select, update 등의 쿼리 작업이 간단한거는 두말하면 잔소리이 되겠지요. 나름대로 상용 프로젝트에서 많이 쓰인 것 같고, 뉴스그룹 쪽에서도 심심치 않게 얘기가 나오는 라이브러리이니 어느정도 신뢰성은 보장된 것 같습니다.


이 라이브러리는  http://otl.sourceforge.net  에서 받을 수 있고, 여러 개의 샘플 코드 또한 거기서 볼 수 있습니다. 물론 영어로 되어 있긴 하지만 튜토리얼도 마련되어 있습니다.참고로 헤더 하나라서 작업하기도 쉽습니다.


구성 클래스들은 뭐가 있을까?


OTL에서 중심 클래스는 크게 3가지로 나누어 집니다. 그 클래스는 otl_connect, otl_stream, otl_exception 입니다.

otl_connect 는 db 자체와 관련된 일을 합니다. 즉 접속, 접속 끊기, 세션 열기, 닫기, 커밋, 롤백, 쿼리 취소 기능을 제공하는 클래스입니다. db에 접속하기위해 가장 먼저해야 하는 일이 이 otl_connect 클래스의 인스턴스를 생성하는 것입니다. ADO 로 따지면 Connection 객체라고 볼 수 있겠습니다.

  다음에 설명하는 것은 otl_stream 입니다. 이 클래스는 무엇인가를 던지고, 받아오는 일을 하는 클래스입니다. 즉 MFC의 CRecordset 과 같은거라고 비유해서 설명할 수 있는데, 이 클래스는 otl_connect 로 db로의 접속을 열고 그 곳으로 쿼리를 던지고 그 결과를 받아오는 일을 합니다. 이건 주 기능이고 자잘하게 나온 데이터에 따라 맞는 데이터를 분석하고 변수와 바인딩하는 일, 넘겨줄 인자 파싱하는 일, 그리고 바인딩하는 법칙 조정하는 일 뭐 자잘하게 하는 것도 많습니다.

다음에 설명할 것은 otl_exception 이다. 이 클래스는 이름을 봐서도 알겠지만 뭔가 문제가 생겼을떄 던지는 예외 클래스입니다. 그럼 C++ 예외 처리로 즉 try , catch 로 잡아서 처리하면 되겠습니다. 그럼 뭐가 문제인지 자세한 설명이 넘어오는 것이죠.(아쉽게도 영어입니다.)  만약 std::exception 와 같이 사용하고 싶다면 매크로를 정의해주면 std::exception 에서 상속받아서 클래스가 만들어집니다.


간단한 소스 코드


 

std::string query= "SELECT LOG_NAME, TO_CHAR(LOG_TIME, 'YYYY/MM/DD HH24:MI:SS'),LOG_SEVERITY,"LOG_CATEGORY,LOG_DES,REQ_IP,REQ_ID,REQ_TYPE,

SUBJECT_DN,SUBJECT_ID FROM table_name ";


otl_stream selectStream(50, query.c_str(), db);

while (!selectStream.eof())

{

   table_name_data data;

   selectStream >> data.log_name >> data.log_time >> data.log_severity

                     >> data.log_category >> data.log_des

                     >> data.req_ip >> data.req_id >> data.owner >> data.table >> data.column;

}

catch (const std::exception& e) { ...}


  위 예제는 db 에서 select 하는 코드입니다. 보시다시피 쿼리 만들고 난 다음에 그걸로 otl_stream 객체를 만든 다음에 db 인스턴스, 즉 otl_connect 로 선언된 db 변수와 함께 생성하고 나서 루프를 돌면서 가져오면 됩니다. 나머지는 C++ cin,cout 객체 사용처럼 하시면 됩니다.

그럼 접속이 궁금하시겠죠? 그 코드는 다음과 같습니다.

 

otl_connect::otl_initialize();

otl_connect db;

db.rlogon("scott/tiger"); // scott/tiger@sid명도 됩니다.


... ( db 쿼리 코드)


otl_connect::otl_terminate();



보시다시피 Initialize 하고 otl_connect 의 rlogin 메소드를 부르는 식으로 되어 있습니다.

물론 다음과 같이 할 수 있습니다.(제가 사용하던 코드의 일부입니다.) 아시는 분은 아시겠지만 오라클 설정 파일에 있는 스트링을 그대로 가져다 쓴 것입니다. 이걸 잘 이용하면 굳이 일일히 TNS명 등록할 필요는 없겠죠?


std::ostringstream ost;

ost <<

   GetID() << '/' << GetPassword() << '@' <<

   "(DESCRIPTION="

   " (ADDRESS_LIST="

   "  (ADDRESS=(PROTOCOL=TCP)(HOST=" << GetHost() << ")(PORT=" << GetPort() << "))"

   " )"

   " (CONNECT_DATA=(SID=" << GetOraSID() << "))"

   ")";


std::auto_ptr<otl_connect> otlConn(new otl_connect(ost.str().c_str()));


이와 같이 간단하게 사용 예제를 보였는데 이를 사용하려면 다음과 같은 선언이 필요합니다.이를 사용하려면 다음과 같이 합니다.



#define OTL_ORA8I

#define OTL_STL

#define OTL_STLPORT

#define OTL_ANSI_CPP

#define OTL_EXCEPTION_DERIVED_FROM std::exception

#define OTL_DEFAULT_STRING_NULL_TO_VAL ""

#include "otlv4.h"



각각 설명하면 OTL_ORA8I는 오라클 8i OCI 를 사용한다는 것을 OTL_STL은 STL 을 사용한다라는 것을, OTL_STLPORT 는 stl port 를 사용한다라는 것을 나타냅니다.

그리고 OTL_ANSI_CPP 는 캐스팅과 같은 것을 일반 c++ 캐스팅을 따르겠다라는 얘기이다.  OTL_EXCEPTION_DERIVED_FROM std::exception는 db 처리시 문제가 생기면 otl_exception을 던지는데 이 클래스가 std::exception 이나 사용자 정의 CException 과 같은 클래스에서 상속받는것을 정해주는 것입니다. 뒤에 std::exception 이 보이시죠?

그리고 마지막은 DB 데이터가 널일 경우(VARCHAR2타입과 같이 string과 매핑되는) string 값이 자동으로 "" 이 값을 가지는 것을 명하는 심볼입니다.


참고 사항

위와 같이 간단히 예제와 함께 사용 방법을 설명해보았습니다. 물론 이보다 더 많은 기능과 함수들이 있습니다만, 너무 많은 관계로 이 글에서 설명하기란 무리인 것 같습니다. 나머지는 직접 사이트에 가서 예제와 일부 설명 문서를 참고하시면 좋겠습니다.

간단히 참고할 사항만 설명드리자면 otl_connect 에서 buffer size 라는 것이 있습니다. 무슨 버퍼를 말하는지 알쏭달쏭 하실 만한 분들이 많을 것 같아 말씀드리자면(문서에도 정확히 나와 있지 않더군요.) 제가 추적해본 결과는 fetch size 를 뜻하는 것으로 생각됩니다. 즉 얼마만큼 DB 데이터를 미리 가져오는가에 대한 설정인 것 같습니다. 물론 많으면 더욱 좋을 수도 있겠고 나쁠 수도 있겠지요. 잘 선택해야 되는 것입니다. 물론 하시다보면 반드시 1로 설정해야 할 때가 있습니다. 다른 것으로 선택하면 예외로 떨어지기도 하죠(1로 설정하라고 설명하긴 합니다.)


그리고 간단한 팁을 하나 설명드리면 DB 데이터를 리스트 컨트롤 등에 부릴 때가 많은데 이럴 때는 반드시 스트링 데이터가 되야 합니다. 하지만 OTL 특성상 각 데이터 타입에 맞게 변수도 int, string 등 다른 타입으로 선언되어야 합니다. 하지만 이걸 일괄적으로 string 으로 맞출 수 있지요. 그건 다음과 같이 하면 됩니다.



otl_stream selectStream;

selectStream.set_all_column_types(otl_all_num2str | otl_all_date2str);

selectStream.open(50, query.c_str(), db);




정리

OTL 이라는 편리한 라이브러리에 대한 소개를 해보았습니다. 저는 DB 접속하는 라이브러리를 이걸로 쓰고 있습니다. 많이 편리했던 관계로 여러분들도 한번 써보시라고 이렇게 소개해드립니다.

나중에 기회가 되는데로 OTL 에 대한 자세한 설명, 그리고 팁 등을 소개하겠습니다.

"Database Programming" 카테고리의 다른 글
  • [Class] ADODB Connect (0)2007/04/03
  • ADODB Manual (0)2007/04/03
  • DB 작업을 보다 쉽게 해보자...(OTL 소개) (2)2007/01/09
  • ADO for Performance (0)2007/01/09
  • ADO 데이타 바인딩 다이얼로그 얻기 (0)2007/01/09
2007/01/09 09:06 2007/01/09 09:06
Posted by webdizen
Tags DB, OTL
No Trackback 2 Comments

Trackback URL : http://www.webdizen.net/blog/trackback/2560

Leave your greetings.

  1. 이정호

    질문이 있습니다.
    db connect를 otl_connect 객체를 통하여 마친 후에, otl_stream을 통하여 sql statment와 binding을 시키고 while문을 통하여
    data를 조회하는 절차로 진행되는데..
    만약, sql statment를 바꿔가며 binding 시킬 경우에는 otl_stream.open()함수를 통하여 기존에 생성한 stream 객체로 statement를 바꾸면 되나요?

    2007/08/01 21:18 [ Permalink : Modify/Delete : Reply ]
  2. webdizen

    sql statment를 바꿔가면서 binding 하실 경우라는 말씀은 위의 Select 질의를 하는 예제에서 otl_stream selectStream(50, query.c_str(), db)와 같은 형태로 쓰여지는 경우를 selectStream을 한번 binding 한 뒤, 다른 binding이 필요할 경우 그대로 써도 되냐는 말씀이신가요? 당연히 기존에 생성하셨던 otl_stream 객체를 statment만 바꿔서 사용하시면 됩니다. 다른 일반적인 라이브러리처럼요 ^^

    2007/08/03 11:26 [ Permalink : Modify/Delete : Reply ]
[로그인][오픈아이디란?]

«Prev  1  Next»

RSS HanRSS
Blog Image
webdizen
이곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (3009)
Webdizen (141)
Life (6)
Diary (16)
Blog (9)
IDEA (2)
Travel (10)
Book (16)
Photo (7)
Movie (8)
Music (14)
Leisure Sports (10)
Funny (6)
Hardware (121)
Software (120)
Windows (5)
Unix & Linux (120)
Installation (5)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (804)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (2)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (4)
Network (66)
Web (79)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • Refactoring
  • Framework
  • 절전 기능
  • 엠파스
  • 데이타 웨어하우스
  • libpcap
  • 싱크
  • JPG
  • Message
  • NFS
  • 전자제품
  • 조니워커 블랙
  • NAP
  • 미국
  • 통합
  • Semantic Web
  • 페스티발 샴페인
  • 감성정보
  • SQLXML
  • 보드카 알렉산더

Recent Articles

  • 트위터(Twitter)의 시작!.
  • 청년 리더의 조건.
  • 애플의 타블렛 PC - 아이패드....
  • 미래의 인터페이스 - 육감 기....
  • 기초발성법 동영상 강좌.

Recent Comments

  • 학교 과제물중 쓰레드에 대하....
    장진혁 03/17
  • 관리자만 볼 수 있는 댓글입....
    비밀방문자 03/12
  • 상대방의 이야기를 열심히 경....
    DoNuts 03/03
  • Lots of students know techn....
    Bobbi35Shannon 02/25
  • 좋은글 잘 보고 갑니다..
    Und_hacker 01/08

Recent Trackbacks

  • printf,scanf를 이용한 형식....
    yundream의 프로그래밍 이야기 03/10
  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 2009
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007

Archive

  • 2010/02 (1)
  • 2010/01 (6)
  • 2009/12 (5)
  • 2009/09 (3)
  • 2009/08 (1)

Calendar

«   2010/03   »
일 월 화 수 목 금 토
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.