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;
}