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\msvc
推荐安装
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
(
int
maxIterations);
//
指定某个参数的大小,
string
和
byte
需要
stmt
->
setMaxParamSize
(
int
parameterIndex,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");
int
quantity;
//
注册输出参数
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;
}
转载: 点击打开链接