OCCI简介

Oracle® C++ Call Interface (OCCI) 是一套应用程序编程接口,它允许C++程序与一个或者多个Oracle数据库进行交互.OCCI给予你强大的数据库操作能力,比如说执行SQL,处理存储过程等.

OCCI主要是提供给有以下需求的用户:

  • 希望借助系统内存和网络连接的合理使用,开发高性能的应用程序.
  • 开发可伸缩的应用程序,以满足数据库用户和请求的不断增长.
  • 支持访问数据库对象.
  • 简化用户认证和密码管理.
  • 支持多层认证模式
  • 两层C/S环境或者多层环境下,动态连接管理和事务管理的一致性接口.

注: OCCI不支持Non-Blocking(非阻塞)模式.

由于OCCI是以动态库方式导出的类库,因此对平台和编译器的依赖性比较强,所以需要根据不同平台,不同编译器取得对应的OCCI接口,并且在自己的程序中链接OCCI的库:


安装OCCI

一般情况下OCCI会随着oracle数据安装,附带安装到某个目录下,不过对于仅仅需要做相关开发的人员来说,这个动作”太大了”,选择安装即时客户端是一个不错的选择,小巧,便于配置,功能完善(对于应用程序开发来说).

我们需要到oracle的网站上下载以下几个东西:

  • instantclient-basic (一些基础组件)
  • instantclient-sdk (开发包,即相关的头文件和库文件)
  • occi (能正确匹配你的开发环境的OCCI库)

虽然instantclient-sdk里已经有了lib和头文件,但occi仍然需要单独下载,因为

instantclient-sdk 只有发行版本的lib和动态库,对于开发和调试来说是不够的.

instantclient-sdk 中的动态库不能直观的判断其CRT库的依赖版本

有一个地方还需要注意,OCCI版本并不是很全,因为它有太多的东西需要对号入座,如开发者的编译器类型,编译器版本,操作系统(x86,x64),Oracle客户端(包含即使客户端)版本.所以尽管OCCI有不少的发行版本,但轮到你具体选择的时候就不多了,比如说你想找支持VC2008的OCCI,你就只能选Oracle11的客户端了,因为Oracle只发行了这样一个版本同支持VC2008.

回到安装的话题上,假设你用windows +VC2008,你需要下载 instantclient-basic-win32-11.1.0.6.0.zip,instantclient-sdk-win32-11.1.0.6.0.zip,occivc9win32_111060.zip.为什么要选11.0.6这个版本?因为我们的开发环境决定了只能找到11.1.6.0这个版本的OCCI库.

  1. 先将下载到的instantclient-basic 解压到C:\ora_env.那么它下面应该有sdk;vc8;vc8;vc71这4个文件夹.
  2. 将instantclient-sdk-win32-11.1.0.6.0.zip中的sdk目录放在C:\ora_env下.
  3. 在C:\ora_env下新建文件夹vc9,将occivc9win32_111060.zip中的4个文件(oraocci11.dll,oraocci11d.dll,oraocci11.dll.manifest,oraocci11d.dll.manifest)放在里面.
  4. 在C:\ora_env\sdk\lib\msvc下新建目录vc9,将occivc9win32_111060.zip中的 oraocci11.lib,oraocci11d.lib放在这个目录里.
  5. 将C:\ora_env\vc9;C:\ora_env;加入PATH环境变量(最好放在前面).
  6. 新建一个环境变量TNS_AMDIN,值为C:\ora_env\;tnsnames.ora文件应该放在这个目录下.
  7. 新建一个环境变量NLS_LANG,值为SIMPLIFIED CHINESE_CHINA.ZHS16GBK(这个值根据自己的情况定).
  8. 删除C:\ora_env下的oraocci11.dll和oraocci11.sym,这个库文件不是链接到VC2008的CRT,C:\ora_env\vc9才是正确的DLL,同时也能更明确表达我们的是使用VC2008开发环境的这样一个情况.
  9. C:\ora_env\sdk\lib\msvc下的oraocci11.lib 也应该删除,原理同上.
  10. 将C:\ora_env\sdk\lib\msvc\vc9加入VC2008库文件搜索路径.
  11. 将C:\ora_env\sdk\include加入VC2008头文件搜索路径.

linux下的配置过程基本一样,但动态库文件(.so)的路径(对应于windows环境下的C:\ora_env\vc9)应该加入到LD_LIBRARY_PATH环境变量中.


开始编码

配置工作做完后,可以写一点代码,测试一下


代码中的数据库连接字符串跟一般我们常用的有点不同,连接字符串可以有下面两种写法:

  • host:[port][/service name]
  • (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=127.0.0.1) (PORT=5521)) 
    (CONNECT_DATA=(SERVICE_NAME=SRV_NAME)))

第二种就是跟tnsnames.ora中的内容一样的了.


常见错误处理

分享一些在开发和测试的过程中,经常会遇见一些常见的问题(win + VC).

编译代码时,发现大量错误,都是说某些CRT函数名称重复.

原因中多半是同一个项目静态链接了两个不同版本的CRT库.比如VC2005的程序A依赖VC2008的程序B(B使用OCCI),B的代码生成方式为/MT或者/MTd.

将上面的场景中,程序B的代码生成方式改成/MD或者/MDd后,编译通过,但是程序运行发生崩溃.

很可能是代码中的某个对象产生和释放分别调用了不同的CRT(一个是VC2005的,一个是VC2008的).解决办法:没有什么好的解决办法,最好还是统一开发环境吧,C++导出的类不适合跨环境.

出现ORA-24960错误

你的项目是debug版本,但链接了release版本的occi库.

出现R6034错误

OCCI库跟你的VC版本不一致.

调试时,发现堆栈被莫名其妙的破坏

同上,或者OCCI的debug与release版本跟当前项目的设置不匹配.

找不到MSVCR90.DLL

记得让你的客户安装VC9的redist.

找不到MSVCR90D.DLL

你发布的程序是调试版本的,虽然你的用户安装了VC9的redist,那也是没用的,因为redist只会安装release版本的运行时库.


参考资料:

<Oracle® C++ Call Interface Programmer's Guide>

Mark Williams 'Blog : http://oradim.blogspot.com/2009/07/getting-started-with-occi-windows.html

文章信息

作者:J.Cheen

出处:www.cnblogs.com/cheen

OCCI编程接口介绍的更多相关文章

  1. Linux-socket编程接口介绍

    1.建立连接 (1).socket.socket函数类似于open,用来打开一个网络连接,如果打开成功则返回一个网络文件描述符(int类型),之后我们操作这个网络连接都可以通过这个网络文件描述符. ( ...

  2. 转:c++ Oracle OCCI 编程

    原地址http://blog.sina.com.cn/s/blog_53a72add01015zj4.html 找不到具体的出处,只好不写了. OCCI数据库ORACLE编程步骤1. 配置环境(1)  ...

  3. c++ Oracle OCCI 编程

    转载备忘:http://blog.sina.com.cn/s/blog_53a72add01015zj4.html 关于occi编程可以参考的链接: http://blog.itpub.net/162 ...

  4. 基于VC的ACM音频编程接口压缩Wave音频(一)

    (一)概述 音频数据一般都具有较高的采样率,经过压缩的原始数据才具有实用价值,否则不仅要占用大量存储空间而且在播放或进行网络传输时效率也是非常低下的,所以音频数字压缩编码在多媒体应用中有着广泛而又重要 ...

  5. MPI编程简单介绍

    第三章MPI编程 3.1 MPI简单介绍 多线程是一种便捷的模型,当中每一个线程都能够訪问其他线程的存储空间.因此,这样的模型仅仅能在共享存储系统之间移植.一般来讲,并行机不一定在各处理器之间共享存储 ...

  6. Winsock编程基础介绍 .

    相信很多人都对网络编程感兴趣,下面我们就来介绍,在网络编程中应用最广泛的编程接口Winsock API. 使用Winsock API的编程,应该了解一些TCP/IP的基础知识.虽然你可以直接使用Win ...

  7. OpenCV 编程简单介绍(矩阵/图像/视频的基本读写操作)

    PS. 因为csdn博客文章长度有限制,本文有部分内容被截掉了.在OpenCV中文站点的wiki上有可读性更好.而且是完整的版本号,欢迎浏览. OpenCV Wiki :<OpenCV 编程简单 ...

  8. Socket网络编程基本介绍

    一,socket的起源 socket一词的起源 在组网领域的首次使用是在1970年2月12日发布的文献IETF RFC33中发现的, 撰写者为Stephen Carr.Steve Crocker和Vi ...

  9. Hadoop 综合揭秘——MapReduce 基础编程(介绍 Combine、Partitioner、WritableComparable、WritableComparator 使用方式)

    前言 本文主要介绍 MapReduce 的原理及开发,讲解如何利用 Combine.Partitioner.WritableComparator等组件对数据进行排序筛选聚合分组的功能.由于文章是针对开 ...

随机推荐

  1. Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略

    V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...

  2. CODEVS_1227 方格取数2 网络流 最小费用流 拆点

    原题链接:http://codevs.cn/problem/1227/ 题目描述 Description 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1, ...

  3. amplab

    https://github.com/amplab/SparkNet https://amplab.cs.berkeley.edu/

  4. ElasticSearch生产模式开发模式的区分

    ElasticSearch生产模式开发模式的区分 network.host: 0.0.0.0 如果network.host不是localhost就是生产模式, 开发模式中的warning就是生产模式中 ...

  5. linux 配置maven环境变量

    vi /etc/profile 按照如下样例编辑环境变量. 编辑之后记得使用source /etc/profile命令是改动生效. 5.验证结果 在任意路径下执行mvn -version验证命令是否有 ...

  6. ZT:与其怨天尤人,不如全力以赴;若想改变世界,你必须先从改变自己开始!

    在闻名世界的威斯特敏斯特大教堂地下室的墓碑林中,有一块名扬世界的墓碑.其实这只是一块很普通的墓碑,粗糙的花岗石质地,造型也很一般,同周围那些质地上乘.做工优良的亨利三世到乔治二世等二十多位英国前国王墓 ...

  7. 一句话说清楚啥是delegate

    所谓托付就是类对象调用.托付对象代表随意实现该托付的类的对象.

  8. 创建节点createElement

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  9. Jenkins+appium+testng持续集成

    Create maven project in eclipseAdd Appium , Selenium dependancyAdd Test in TestNG testCreate TestNG ...

  10. 文件宝局域网传输/播放功能使用帮助(Mac电脑用户)

    使用局域网账户密码登录,可以访问电脑上所有文件 使用游客无账户密码登录,只能访问电脑上指定共享文件夹的文件. 怎么设置共享文件夹请参考: 1.打开“共享”偏好设置(选取苹果菜单 >“系统偏好设置 ...