Oracle表数据的C++存取接口

Oracle的表数据有多种存取方式,这里,着重介绍oracle 9i及其以后版本提供的C++接口,一种目前为止,最简单实用的编程接口

 

  1. Oracle表数据的C/C++存取方法
    1. Pro C/C++
      Pro C/C++是非常传统的接口,底层接口是 SQL-LIB,是一种在 C/C++代码里直接插入PLSQL语句实现oracle 数据库操作方法.虽然还是有很多公司依然采用这种接口方法,但是,一般来说,并不推荐,主要原因是,本身Pro C/C++有一套语法需要学习,另外,调试不便,多线程处理,多实例连接等情况,用起来比较复杂,而且不一定好用.
    2. OCI
      OCI是最基础的接口,几乎是其他接口的基础。它的功能最强大,但是使用极其复杂。一般的程序员,看了极易头晕。好比是用windows sdk 编写windows程序一样,要初始化一大堆接口,一大堆句柄,处理一大堆信息。除非对速度要求极高的场合,一般最好不要用这个接口。
    3. ODBC
      odbc接口是基于OCI的高一级接口,相对来说,也很复杂,但是,vc在基于此上面封装了自己的类,用起来简单的多,但是,由于加了odbc接口层,相对来说,慢一些,对于大量数据的bulk操作,速度要慢很多,动态SQL功能也往往受一些限制.另外,odbc主要基于windows平台,unixodbc没有商业公司的支持,在unix/linux平台下基本上不会使用odbc接口.
    4. ado及bde
      ado是ms力推的主要数据库接口,bde是borland力推的主要数据库接口 ,都是基于odbc和oci, 由于经过用类接口封装,操作也很简单,但有windows平台的限制.
    5. rw dbtools
      Rogue Wave dbtools也是直接调用oci,在几年前,是一套非常好用的商业版的数据库接口软件,可用于unix/windows,方便实用,甚至提供了数据库连接池,但是由于bug多,价格昂贵,用户并不多,尤其是进几年,更少见.但是其影响深远,对后来的C++接口的数据库存取接口起了样板作用.
    6. OTL
      otl是一套基于oci的数据库操作C++模板库接口,完全免费,提供全部源码(全部在头文件里面),操作极其简单,动态sql调用,bulk操作等,方便实用,速度极快.尤其是独具的流操作,<<操作符即可输入动态参数,>>操作符即可输出数据库记录数据,另人拍案叫绝.国内一些大的软件公司,例如亚信(Asiainfo),也把它作为oracle数据操作的主要接口.它的主页是http://otl.sourceforge.net/home.htm,值得研究一下.
    7. OCCI
      OCCI是oracle 提供的C++调用接口,全名为 Oracle C++ Call Interface,在9i及其以后的版本中提供, 适用于unix/linux/windows,虽然底层基于oci,但是,调用非常简单,几乎就是jdbc的C++翻版.OCCI是向大家我力推的接口,并且在本文的后半部分进行作更详细的描述.它的帮助文档在http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96583/toc.htm
  2. OCCI接口
    本环节,将以windows环境下,详细介绍用vc6.0调用occi操作oracle数据库的方法.在unix/linux下,调用occi的方法,只是编译开关不同
    1. 安装
      在安装oracle的时候,请选中oci及occi.
    2. 连接的参数
      和oci等接口一样,要求user,passwd,sid三个参数,如果是通过ipc连接或使用环境变量的SID,sid参数可以不用指定.sid的配置,可能涉及到sqlnet.ora和tnsnames.ora文件,请使用oracle自带的网络配置工具配置或直接手工编辑这两个文件.
    3. 基本调用步骤
      调用步骤很简单,初始化环境,建立数据库连接,建立sql会话,输入动态参数,执行sql会话,取结果集,访问结果集,关闭结果集,关闭会话.程序退出时,关闭数据库连接,反初始化环境.以上是最多的步骤,例如,可能没有动态参数,也没有结果集的操作.另外,需要捕获异常.
    4. 一个简单的例子
       给出一个的例子,以便后面讲解
      #include "windows.h"
      #include "occi.h"
      using namespace oracle::occi;
      using namespace std; int main(int argc,char *argv[]) { Environment *m_Env=NULL ;
      Connection * m_Conn=NULL; char szUser[]="abc"; char szUser[]="ora123"; char szSid[]="sid000"; m_Env = Environment::createEnvironment();
      m_Conn=m_Env->createConnection(szUser,szPasswd,szSid);
      if(m_Conn==NULL) { Environment::terminateEnvironment(m_Env);
      return -1;
      } Statement * localStatement=m_Conn->createStatement(
      "select f2 from test_tab where f1>=:f1");
      if(localStatement==NULL)
      return -1;
      localStatement->setInt(1,100);
      ResultSet * rs = NULL;
      try
      {
      rs=localStatement->executeQuery();
      }
      catch(SQLException &e)
      {
      OutputDebugString(e.getMessage().data());
      m_Conn->terminateStatement(localStatement);
      return -2; }
      if(rs==NULL)
      {
      m_Conn->terminateStatement(localStatement);
      return -3;
      }
      ResultSet::Status localStatus=rs->next();
      string localStr2;
      if(localStatus==ResultSet::END_OF_FETCH)
      { return -3;
      }
      else
      {
      localStr2=rs->getString(1);
      }
      localStatement->closeResultSet(rs);
      m_Conn->terminateStatement(localStatement);

      m_Env->terminateConnection(m_Conn); Environment::terminateEnvironment(m_Env);
      return 0; }
      • occi调用分析
        使用的class: Environment,Connection,Statement,ResultSet.数据库异常类SQLException.非oracle定义类,直接使用编译器提供stl,例如string.
        获得环境的句柄 Environment::createEnvironment();
        建立数据库连接 m_Conn=m_Env-&gt;createConnection(szUser,szPasswd,szSid);
        建立SQL会话 localStatement=m_Conn->createStatement("select f2 from test_tab where f1>=:f1"); 可以是任何plsql语句,包括动态sql.
        输入动态参数 localStatement->setInt(1,100);
        执行SQL会话并取结果集 rs=localStatement->executeQuery();
        访问结果集并判断结果集状态 ResultSet::Status localStatus=rs->next();
        获得结果集的数据 : localStr2=rs->getString(1);主意,字符类型字段取得的值是string的实例
        关闭结果集: localStatement->closeResultSet(rs);
        结束本条SQL会话 : m_Conn->terminateStatement(localStatement);
        关闭数据库连接 : m_Env->terminateConnection(m_Conn);
        反初始化环境 : Environment::terminateEnvironment(m_Env);
        注意,每一步操作时,都可能产生SQLException异常,最好能捕获并处理它.
        occi还提供Blob和Clob等class,以便blob及clob等类型的输入和输出.

      • 编译开关设置
        由于使用了stl,vc要求使用特定的编译开关,才能保证编译通过,运行时,内存管理不出错.
        编译时,要定义WIN32COMMON,_DLL,_MT这三个宏.include路径应包含 %ORACLE_HOME%/oci/include
        连接时,要添加oraocci9.lib,msvcrt.lib,msvcprt.lib,lib路径应包含%ORACLE_HOME%/oci/lib/msvc
不难看出,OCCI完完全全就是jdbc的c++版本
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值