在VC++中使用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\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;
}
 
转载: 点击打开链接

你可能感兴趣的:(oracle,vc++,occi)