來源:
http://www.sitelife.cn/bbs/thread-1871-1-1.html操作環境:
1. 操作系統:Windows XP Professional with SP2。
2. 編程環境:Visual C++ 6.0 with SP6。
3. 數據庫環境:Access 2003。
OTL簡介:OTL 是 Oracle, Odbc and DB2-CLI Template Library 的縮寫,是一個C++編譯中操控關系數據庫的模板庫,它目前幾乎支持所有的當前各種主流數據庫,例如Oracle, MS SQL Server, Sybase, Informix, MySQL, DB2, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen, MS ACCESS等等。OTL中直接操作Oracle主要是通過Oracle提供的OCI接口進行,進行操作DB2數據庫則是通過CLI接口來進行,至于MS的數據庫和其它一些數據庫,則OTL只提供了ODBC來操作的方式。當然Oracle和DB2也可以由OTL間接使用ODBC的方式來進行操縱。
在MS Windows and Unix 平臺下,OTL目前支持的數據庫版本主要有:Oracle 7 (直接使用 OCI7), Oracle 8 (直接使用 OCI8), Oracle 8i (直接使用OCI8i), Oracle 9i (直接使用OCI9i), Oracle 10g (直接使用OCI10g), DB2 (直接使用DB2 CLI), ODBC 3.x ,ODBC 2.5。OTL最新版本為4.0,參見
http://otl.sourceforge.net/,下載地址
http://otl.sourceforge.net/otlv4_h.zip。
優點:
a. 跨平臺
b. 運行效率高,與C語言直接調用API相當
c. 開發效率高,起碼比ADO.net使用起來更簡單,更簡潔
d. 部署容易,不需要ADO組件,不需要.net framework 等
缺點:
a. 說明文檔以及范例不足夠豐富(暫時性的)
其實現在它提供有377個使用范例可參考,下載地址:
http://otl.sourceforge.net/otl4_examples.zip。
建立數據源1.依次點擊“開始->控制面板”,打開“控制面板”界面,雙擊“管理工具”,然后再雙擊“數據源(ODBC)”,就打開了“ODBC數據源管理器”,選擇“系統DSN”。
2.單擊“添加”,彈出“創建新數據源”對話框,選擇“Microsoft Access Driver(*.mdb)”。
3.點擊“完成”,彈出“ODBC Microsoft Access安裝”對話框,單擊“創建”,開始創建數據庫,彈出“新建數據庫”對話框,添加數據庫名稱my_db和選擇數據庫存放目錄,單擊“確定”,創建完成,然后添加數據源名:my_db。點擊“確定”。
4.然后在系統數據源中就有我們剛才添加的數據源。
5.單擊“確定”,完成數據源的創建。
OTL編程下面我們用一個實例來說明:
1. 創建數據表:TestTable ( ColumA int , ColumB varchar(50),ColumC varchar(50) )
2. 插入100條數據,ColumA 為數據的 id 范圍:0-99 , ColumB=”Test Data %d” , 其中 %d=id 。
3. 刪除表中ColumA 中小于10和大于90的數據。
4. 將ColumA為3的倍數的記錄中ColumC更新為ColumB的內容。
具體代碼為:
#include <iostream>
using namespace std;
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define OTL_ODBC // 編譯 OTL 4.0/ODBC
// #define OTL_ODBC_UNIX // 如果在Unix下使用UnixODBC,則需要這個宏
#include "otlv4.h" // 包含 OTL 4.0 頭文件
otl_connect db; // 連接對象

//此函數完成插入100條數據,ComulA為數據的id,范圍為0-99,
//ColumB="Test Data %d",其中%d=id
void insert()
// 向表中插入行


{
// 打開一個通用的流,以模板的方式向表中插入多項數據
otl_stream
o(1, // 流的緩沖值必須設置為1
"insert into TestTable values(:f1<int>,:f2<char[50]>,:f3<char[50]>)",
// SQL 語句
db // 連接對象
);
char tmp1[32];
char tmp2[30];


for(int i=0;i<100;++i)
{
sprintf(tmp1,"Test Data %d",i);
sprintf(tmp2,"");
o<<i<<tmp1<<tmp2;
}

}
//此函數完成刪除表中ColumA中小于10和大于90的數據
void delete_rows()


{
long rpc=otl_cursor::direct_exec(db,"delete from TestTable where ColumA<10 or ColumA>90");
// rpc是作用效果的返回值,otl_cursor::direct_exec為直接執行sql語句
cout<<"Rows deleted: "<<rpc<<endl;
}

//此函數完成將ColumA為3的倍數的記錄中ColumC更新為ColumB的內容
void update()
// 更新表


{
otl_stream
o(1, // 緩沖值
"UPDATE TestTable "
" SET ColumC=:f2<char[50]> "
" WHERE ColumA=:f1<int>",
// UPDATE 語句
db // 連接對象
);
otl_stream c(1,"select ColumB from TestTable where ColumA=:f3<int>",db);
char temp[10];
for(int i=10;i<91;i++)


{
if(i%3==0)

{
c << i;
c >> temp;
o << temp << i;
}
}

}

int main()


{
otl_connect::otl_initialize(); // 初始化 ODBC 環境

try
{
db.rlogon("UID=scott;PWD=tiger;DSN=my_db"); // 連接到 ODBC
//或者使用下面的連接語句方式。
// db.rlogon("scott/tiger@firebird"); // connect to ODBC, alternative format
// of connect string
otl_cursor::direct_exec
(
db,
"drop table TestTable",
otl_exception::disabled // disable OTL exceptions
); // drop table
//這里完成表的創建
otl_cursor::direct_exec
(
db,
"create table TestTable(ColumA int, ColumB varchar(50),ColumC varchar(50))"
); // create table
insert(); // insert records into the table
// update(10); // update records in the table
delete_rows();
update();
}


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.sqlstate<<endl; // print out SQLSTATE message
cerr<<p.var_info<<endl; // print out the variable that caused the error
}

db.logoff(); // disconnect from the database

return 0;

}