|
源代码网推荐
OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个C++操控关系数据库的模板库,最新版本4.0.104,参见http://otl.sourceforge.net/,下载地址http://otl.sourceforge.net/otlv4_h.zip。 优点:a. 跨平台 b. 运行效率高,与C语言直接调用API相当 c. 开发效率高,起码比ADO.net使用起来更简单,更简洁 d. 部署容易,不需要ADO组件,不需要.net framework 等 缺点: a. 只有C++才可以使用她 b. 说明以及范例不足(暂时性的)
总的说来,对于C++程序员而言,使用OTL操作关系数据库是最好的选择,其网站上有很多的范例,本人在这里对使用OTL调用Oracle的存储函数(存储函数比存储过程多个返回值)作一个示范,而其他的比如查询、更新、存储过程等就太简单了,直接看otl.sourceforge.net的范例 。
Oracle 存储函数 TEST 代码: ( a In Integer, b Out Integer, c in out Integer, d In Long ) Return Long is begin b := a; c := 2 * c; Return( "<" || d || ">" ); end; 说明:Oracle中的long不是C/C++中的长整型,而是varchar_long,对应着OTL中的otl_long_string,这是一种很复杂的类型,本人就用它来举例。
C++调用TEST的代码: #include <string> #include <iostream> //#define OTL_ORA9I // 使用这个宏就表示使用Oracle9i的API,而不是ODBC API #define OTL_ODBC // 使用这个宏就表示使用通用的ODBC API #include "otlv4.h" using namespace std;
void main( void ) { otl_connect::otl_initialize(); try { otl_connect db; db.rlogon( "Driver={Microsoft ODBC for Oracle};Server=ZZZ;Uid=XXX;Pwd=YYY;" ); // db.set_max_long_size(?); 如果varchar_long长度非常长,超过默认值的话,你需要这一句
otl_stream o( 1, "{ :E<varchar_long,out> = call TEST( :A<int,in>,:B<int,out>,:C<int,inout>,:D<varchar_long,in&g t; ) }", db ); o.set_commit(0);
int a = 1; int b = 0; int c = 2; otl_long_string d( "abc", 0, 3 ); otl_long_string e; o << a << c << d; o >> e >> b >> c; cout << "b = " << b << "
"; cout << "c = " << c << "
"; cout << "e = " << e.v << "
";
//db.commit(); db.logoff(); } catch( otl_exception& p ) { cerr << p.msg << "
" << p.stm_text << "
" << p.sqlstate << "
" << p.var_info << "
" << endl; } }
说明:"{ :E<varchar_long,out> = call TEST( :A<int,in>,:B<int,out>,:C<int,inout>,:D<varchar_long,in&g t; ) }"这一句中的A、B、C、D、E就是一个名字,随各人喜欢可写成其他任何名称。但这个格式需要注意,它不是 "{ call :Name1<int,out> := function( Name2<int,in> }" 也不是 "{ call :Name1<int,out> \:= function( Name2<int,in> }" 而是 "{ :Name1<int,out> = call function( Name2<int,in> }" 这一点和otl.sourceforge.net上的说明不一样。
源代码网供稿. |