怎么在VC++中使用Oracle C++ Call Interface(OCCI)?

1.简介

occi简介

oracle c++ call interface (occi) 是一套应用程序接口,它允许c++程序与一个或者多个oracle进行交互.occi给予你强大的数据库操作能力,比如说执行sql,处理存储过程等.

在windows下访问oracle数据库可以使用ado,ado.net,oledb,odbc,跨平台的occi等方法,其中速度最快,对oracle支持最完整的是oracle提供的occi。

开发基于oracle数据库的应用程序,我们可以选择多种工具,不仅可以用一般的数据库开发技术,诸如ado(activex data objects)、odbc(open database connectivity)等等,同时,也可以用oracle公司提供的专门的开发工具,诸如pro c_c++,oci(oracle call intedace)等等。比较这几种方式,前者因为是通用技术,开发起来比较容易,但是有一个致命的弱点就是诸如ado之类的通用技术的速度太慢,如果我们要开发管理海量数据的数据库,比如影像数据库,那么,这种速度我们是不能忍受的。而oci虽然开发起来难度大一些,但是它的速度极快,而且是一种底层接口,几乎可以操纵oracle数据库的任何对象。 

2.安装occi sdk

occi sdk包含在oracle客户端中,在如下位置可以找到:

头文件:c:\oracle\ora92\oci\include

库文件:c:\oracle\ora92\oci\lib\ms

推荐安装oracle即时客户端(instant client),它也包含有occi sdk。

头文件:instantclient_10_2\sdk\include

库文件:instantclient_10_2\sdk\lib\msvc

3.编译occi程序

关于在vc下如何编译,调试occi程序,参见《vc++调试occi程序的关键设置》

4.occi编程步骤

4.1连接到数据库

//创建occi上下文环境

environment*env= environment::createenvironment();

assert(env!=null);

//创建数据库连接

connection*conn= env->createconnection(“uid”,”pwd”,”oracle_svr_name”);

//…

// todo:插入自己的代码

//关闭连接

env->terminateconnection(conn);

//释放

environment::terminateenvironment(env);

4.2执行基本的sql语句

//创建sql语句控制句柄

statement*stmt= conn->createstatement();

a.执行一般的sql语句

stmt->executeupdate(“create table basket_tab (fruit varchar2(30), quantity number)”);

stmt->executeupdate(“delete basket_tab”);

b.重复利用sql语句,参数化的sql语句

//:1,:2是参数占位符

stmt->setsql(“insert into basket_tab values(:1,:2)”);

//第一个参数

stmt->setstring(1,”bananas”);

//第二个参数

stmt->setint(2,5);

stmt->executeupdate();

 c.一次修改多行数据

//最多允许的迭代次数,注意这个参数需要在setxxx系列函数之前执行

stmt->setmaxiterations(intmaxiterations);

//指定某个参数的大小,string和byte需要

stmt->setmaxparamsize(intparameterindex,int maxparamsize);

for(…)

{

    // 第一个参数

    stmt->setstring(1,”bananas”);

    // 第二个参数

    stmt->setint(2,5);

    //増加一行记录,类似于ado的addnew

    pstmt->additeration();

}

stmt->executeupdate();

d.执行查询:获取结果集(记录集)

resultset*rs= stmt->executequery(“select * from basket_tab”);

while(rs->next())

{

    string fruit =rs->getstring(1);// get the first column as string

    int quantity =rs->getint(2);// get the second column as int

}

//关闭结果集

stmt->closeresultset(rs);

e.执行存储过程

//指定存储过程countfruit

stmt->setsql(“begin countfruit(:1, :2); end:”);

//设置第一个参数

stmt->setstring(1,”apples”);

intquantity;

//注册输出参数

stmt->registeroutparam(2,type::occiint,sizeof(quantity));

//执行此存储过程

stmt->executeupdate();

//释放sql语句控制句柄

conn->terminatestatement(statement*stmt);

4.3事务

所有的ddl默认开始并自动提交一个事务

所有的dml默认开始一个事务,且不会自动提交

//可以指定dml是否自动提交

stmt->setautocommit(true/false);

//也可以手动提交或回滚。

conn->commit();

conn->rollback();

4.4异常处理

try

{

    //occi程序

}

catch(sqlexception&sqlexcp)

{

    cerr <<sqlexcp.geterrorcode<<“: ” << sqlexcp.geterrormessage()<<endl;

}

catch(exception&excp)

{

    cerr << excp.what()<<endl;

}

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐