OCCI入门(VC2010下配置)

简介:
刚刚在vs2010下配置成功,麻烦非常多。 

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客户端 ):
 

可能是类库与客户端版本不匹配,建立的连接有问题。
debug下运行正常,release下去始终运行出错,不知何故。

2012-09-22补充
1.下载安装11.2.0.3.0普通客户端解决了release无法运行问题。
2.编译通过运行出错两个问题:
2.1环境变量ORACLE_HOME问题
如果有多个客户端会冲突,则这句运行不过去。
Environment  *env = Environment::createEnvironment();   
删除ORACLE_HOME通过注册表设置路径。
2.2无法建立连接,下面这句运行不过去。
Connection  *conn = env->createConnection("uid", "pwd","oracle_svr_name");  
打开服务器端正确创建监听器(LISTENER)和服务。

在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->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
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   

url:http://greatverve.cnblogs.com/archive/2012/09/08/occi-vc2010.html



    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/greatverve/archive/2012/09/08/occi-vc2010.html,如需转载请自行联系原作者


相关文章
|
并行计算 Docker 容器
Mamba 环境安装:causal-conv1d和mamba-ssm报错解决办法
Mamba 环境安装:causal-conv1d和mamba-ssm报错解决办法
6636 0
GitHub现新霸主!「Java并发编程实战攻略」竟是阿里内部顶级机密
随着经济环境下行,大厂降本增效、筛除了一部分冗余岗位,原本荒蛮的 IT 行业发展正在逐步进入正轨中。虽说依旧算是不温不火,但在今年的技术招聘市场上,Java 依旧是当仁不让的霸主!
|
存储 算法 Java
JVM学习日志(十三) G1垃圾回收流程 及 垃圾回收器总结
G1垃圾回收流程 及 垃圾回收器 总结 简述
675 0
JVM学习日志(十三) G1垃圾回收流程 及 垃圾回收器总结
|
运维 Java 关系型数据库
Exception: HOUR_OF_DAY: 0 -> 1
Exception: HOUR_OF_DAY: 0 -> 1
922 1
|
数据可视化 Ubuntu Linux
PyCharm连接远程服务器配置的全过程
相信很多人都遇见过这种情况:实验室成员使用同一台服务器,每个人拥有自己的独立账号,我们可以使用服务器更好的配置完成实验,毕竟自己哪有money拥有自己的3090呢。 通常服务器系统采用Linux,而我们平常使用频繁的是Windows系统,二者在操作方面存在很大的区别,比如我们实验室的服务器采用Ubuntu系统,创建远程交互任务时可以使用Terminal终端或者VNC桌面化操作,我觉得VNC很麻烦,所以采用Terminal进行实验,但是Terminal操作给我最不好的体验就是无法可视化中间实验结果,而且实验前后的数据上传和下载工作也让我头疼不已。
|
移动开发 前端开发 JavaScript
移动端 Hybrid 开发:RN、Flutter与Webview的抉择与融合
【4月更文挑战第6天】本文对比了移动端Hybrid开发的三种主流方案——React Native (RN),Flutter和Webview。RN基于JavaScript,适合React熟练的团队,适用于性能要求高、跨平台的中大型应用。Flutter,使用Dart语言,以其高性能和自定义UI适用于追求极致体验的项目。Webview适合快速移植Web应用至移动端,开发成本低但性能受限。选择时要考虑项目规模、性能需求、团队技术栈等因素,实际应用中常采用混合策略,如RN/Flutter+Webview、原生模块集成等,以实现最佳开发效果和长期技术规划。
1730 0
|
JavaScript Java 测试技术
基于SpringBoot+Vue的图书进销存管理系统附带文章和源代码
基于SpringBoot+Vue的图书进销存管理系统附带文章和源代码
197 2
|
存储 弹性计算 人工智能
2024阿里云99计划2核2G服务器99元/年,新购续费都是99元
2024阿里云99计划2核2G服务器99元/年,新购续费都是99元