欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-15 11:05:38
1.简介 occi简介 oracle c++ call interface (occi) 是一套应用程序接口,它允许c++程序与一个或者多个oracle进行交互.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;

}