您的位置:首页 > 数据库 > Oracle

OCCI入门(VC2010下配置) 32位测试通过

2013-07-26 11:32 363 查看
Oracle相关下载地址:
http://www.oracle.com/technetwork/indexes/downloads/index.html 



Instant Client是即时客户端,普通的客户端最高版本是11.2.0.1.0,

即时客户端支持到最新11.2.0.3.0

支持VC2010的类库下载(目前只支持11.2.0.3.0和11.2.0.3.0客户端):
http://www.oracle.com/technetwork/database/occidownloads-083553.html 

可能是类库与客户端版本不匹配,建立的连接有问题。

debug下运行正常,release下去始终运行出错,不知何故。

在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程序,参见下面

 

4.OCCI编程步骤

 

4.1 连接到数据库

 

//创建OCCI上下文环境

Environment *env = Environment::createEnvironment();

assert(env!=NULL);

 

//创建数据库连接

Connection *conn = env->
144cf
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;

}

VC++调试OCCI程序的关键设置

#define WIN32COMMON
//解决error C2995: 'getVector' : template function has already been defined


#include <occi.h>

using namespace oracle::occi;

#pragma comment(lib,"oci.lib")

#pragma comment(lib,"ociw32.lib")

#pragma comment(lib,"oraocci10.lib")

//解决无法调试OCCI的问题
//参考sdk\demo目录下的make.bat

对于VS2003:
1.项目属性 -> C/C++ -> 代码生成 -> 运行时库 -> 多线程调试 DLL (/MDd)

2.项目属性 -> 链接器 -> 输入 -> 附加依赖项 -> msvcrt.lib msvcprt.lib

对于VC++6.0
1.Project Settings -> C/C++ -> Code Generation -> Use run-time library: -> Debug Multithreaded DLL

2.Project Settings -> Link -> Object/library modules:末尾添加msvcrt.lib msvcprt.lib  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OCCI 32位 Oracle C++