Chinaunix首页 | 论坛 | 博客
  • 博客访问: 902331
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-19 10:31:07

OTL介绍:
OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个C++操控关系数据库的模板库,最新版本4.0.104,参见,下载地址。
优点:a. 跨平台
      b. 运行效率高,与C语言直接调用API相当
      c. 开发效率高,起码比ADO.net使用起来更简单,更简洁
      d. 部署容易,不需要ADO组件,不需要.net framework 等
缺点:
      a. 只有C++才可以使用她
      b. 说明以及范例不足(暂时性的)


总的说来,对于C++程序员而言,使用OTL操作关系数据库是最好的选择,其网站上有很多的范例,本人在这里对使用OTL调用Oracle的存储函数(存储函数比存储过程多个返回值)作一个示范,而其他的比如查询、更新、存储过程等就太简单了,直接看。

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
#include
//#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 = call TEST(  :A,:B,:C,:D        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   << '\n';
        cout << "c = " << c   << '\n';
        cout << "e = " << e.v << '\n';

        //db.commit();
        db.logoff();
    }
    catch( otl_exception& p ) {
        cerr << p.msg << "\n"
            << p.stm_text << "\n"
            << p.sqlstate << "\n"
            << p.var_info << "\n"
            << endl;
    }
}

说明:"{ :E = call TEST(  :A,:B,:C,:D"{ call :Name1 := function( Name2 }"
也不是
"{ call :Name1 \\:= function( Name2 }"
而是
"{ :Name1 = call function( Name2 }"
这一点和otl.sourceforge.net上的说明不一样。
阅读(3720) | 评论(18) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-19 10:36:24

sinall
楼上的,说明都在这里啊:
http://otl.sourceforge.net/
不能再详细了……

网友评论2012-11-19 10:36:08

吴春福
我现在用otl从oracle取出数据,但由于收到的sql语句是动态的,所以我无法先确定字段的属性,请教各位高人,如何把取出的字段都以字符串输入

我从一些网站上找到一些如下的代码,但看不懂,请教有没有中文解释改类的使用及参数的使用

otl_stream i;

i.set_all_column_types(otl_all_num2str );

gdb.set_max_long_size(20000);    //read long longraw

string f1;

char f2[200];

string f10;

otl_value<otl_datetime> f3;

otl_column_desc* desc;

网友评论2012-11-19 10:35:51

七猫的垃圾箱
to:firingme
写好后能OPEN吗?我很期待,因为我觉得在方便上,DTL和OTL都很方便了,虽然DTL效率可能是有些问题,不过既然DTL全基于ODBC,效率不会成为瓶颈,





OTL是使用的ORACLE和DB2的原生API,ODBC的支持是后来才加入的,一个头文件5万多行吧,可以去看看此人简历。

网友评论2012-11-19 10:35:34

BlueICE
我最反感一些人说别人的东西如何如阿不好,还不如自己如何如何,你能写出这样的创意的东西还公布源代码吗,你不行,至少你没有这样作过,那么你没有权利说这样的话。再者,也许你会作,但你会如此执着的写这样长的代码,我觉的作这样的工作值得我们尊敬,同样一些使用这个库的朋友link oci.lib都没有加,想想我们国家的计算机水平,当然我也曾经这样。所以我们没有什么理由说如何如何,如果你觉得不好,只能证明你没有好好的去用,OciClasses你用过吗,这个东西比起OTL可以说差远了,但CodeGuru的网上还有很多人感谢OciClasses的作者!谦虚,一些未尝不是一件好事!

网友评论2012-11-19 10:35:20

(愤怒的话梅)
汗自己,写出来了