zoukankan      html  css  js  c++  java
  • OCCI编程接口介绍

    OCCI简介

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

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

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

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

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

    LINK-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_envsdklibmsvc下新建目录vc9,将occivc9win32_111060.zip中的 oraocci11.lib,oraocci11d.lib放在这个目录里.
    5. 将C:ora_envvc9;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_envvc9才是正确的DLL,同时也能更明确表达我们的是使用VC2008开发环境的这样一个情况.
    9. C:ora_envsdklibmsvc下的oraocci11.lib 也应该删除,原理同上.
    10. 将C:ora_envsdklibmsvcvc9加入VC2008库文件搜索路径.
    11. 将C:ora_envsdkinclude加入VC2008头文件搜索路径.

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


    开始编码

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

    View Code


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

    • 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

  • 相关阅读:
    html 上传图片前预览
    php获取当月天数及当月第一天及最后一天、上月第一天及最后一天实现方法
    php 计算 pdf文件页数
    php 获取半年内每个月的订单数量, 总价, 月份
    php 获取两个数组之间不同的值
    小程序支付功能
    关于nginx的Job for nginx.service failed because the control process exited with error code.错误
    linux 安装 Apollo
    MongoDB待续。。。
    ABP vNext...待续
  • 原文地址:https://www.cnblogs.com/xumaojun/p/8541237.html
Copyright © 2011-2022 走看看