VC++中使用OCCI

 1.简介
在Windows下访问Oracle数据库可以使用ADO,ADO.Net,OLEDB,ODBC,跨平台的OCCI等方法,其中速度最快,对Oracle支持最完整的是Oracle提供的OCCI.

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值