C++クラス:OTL共通のデータベース接続クラス

3402 ワード

From:http://www.cppblog.com/lovefeel2004/archive/2010/06/02/116946.aspx
OTLは、純C++の汎用データベース接続テンプレートライブラリであり、Oracle、Syboase、MySQL、PostgreSQL、EnterprseDB、SQLiteなど、現在流行のさまざまなデータベースをサポートすることができます。  MS ACCESS、Firebirdなどはプラットフォームにまたがったクラスです。MS Windowsでは、Linux/Unix/Mac OS Xは全部使えます。
ウェブサイトをダウンロード:http://otl.sourceforge.net/
OTLは使いやすいので、ヘッダファイルに「otlv 4.h」というものが含まれていればいいですが、実際にはOTL全体で一つです。Hのファイルはとても便利です。
OTLの使い方:
1、まず接続するデータベースタイプを指定し、OTLはマクロ定義で接続するデータベースタイプを指定します。OTLはこのマクロ定義に基づいてデータベース接続の環境を初期化します。
関連するマクロ定義リスト http://otl.sourceforge.net/otl3_comppile.httm
例えば:萼define OTL_ORA 8 IはOracle 8 iデータベースに接続することを表します。
 
2、例
#include <iostream>
using namespace std;
#include <stdio.h>

#define OTL_ORA8I //           
#include <otlv4.h> // include the OTL 4 header file

otl_connect db; //        



void insert()
//     

{
	otl_stream o(50, // buffer size
		"insert into test_tab values(:f1<float>,:f2<char[31]>)",
		// SQL statement
		db // connect object
		);
	char tmp[32];
	
	for(int i=1;i<=100;++i){
#if defined(_MSC_VER)
#if (_MSC_VER >= 1400) // VC++ 8.0 or higher
		sprintf_s(tmp,sizeof(tmp),"Name%d",i);
#else
		sprintf(tmp,"Name%d",i);
#endif
#else
		sprintf(tmp,"Name%d",i);
#endif
		o<<static_cast<float>(i)<<tmp;
	}
}

//    

void select()
{
	otl_stream i(50, // buffer size
		"begin "
		"  open :cur1 for "
		"   select * from test_tab "
		"   where f1>=:f<int> and f1<=:f*2; "
		"end;", // SELECT statement via referenced cursor
		db, // connect object
		":cur1" // referenced cursor placeholder name
		);
	// create select stream
	
	otl_column_desc* desc;
	int desc_len;
	
	i<<4; // Before the child SELECT statement can be described,
	// the PL/SQL master block needs to be executed.
	// Forcing the execution of the blcok by entering its input
	// patameter.
	
	desc=i.describe_select(desc_len);
	
	for(int n=0;n<desc_len;++n){
		cout<<"========== COLUMN #"<<n+1<<" ==========="<<endl;
		cout<<"name="<<desc[n].name<<endl;
		cout<<"dbtype="<<desc[n].dbtype<<endl;
		cout<<"otl_var_dbtype="<<desc[n].otl_var_dbtype<<endl;
		cout<<"dbsize="<<desc[n].dbsize<<endl;
		cout<<"scale="<<desc[n].scale<<endl;
		cout<<"prec="<<desc[n].prec<<endl;
		cout<<"nullok="<<desc[n].nullok<<endl;
	}
	
	
}

int main()
{
	otl_connect::otl_initialize(); //    Oracle  
	try{
		
		db.rlogon("scott/tiger"); //   Oracle
		
		otl_cursor::direct_exec
			(
			db,
			"drop table test_tab",
			otl_exception::disabled // disable OTL exceptions
			); // drop table
		
		otl_cursor::direct_exec
			(
			db,
			"create table test_tab(f1 number, f2 varchar2(30))"
			);  // create table
		
		insert(); 
		select();
		
	}
	
	catch(otl_exception& p){ // intercept OTL exceptions
		cerr<<p.msg<<endl; // print out error message
		cerr<<p.stm_text<<endl; // print out SQL that caused the error
		cerr<<p.var_info<<endl; // print out the variable that caused the error
	}
	
	db.logoff(); //       
	
	return 0;
}