C++通过OCCI操作Oracle
C++通过OCCI操作Oracle
_编程菜鸟_ 发表于2年前
C++通过OCCI操作Oracle
  • 发表于 2年前
  • 阅读 1541
  • 收藏 2
  • 点赞 1
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: C++中操作Oracle数据库的方法很多,本文主要介绍C++通过OCCI操作Oracle数据库。

简介

Windows下访问Oracle数据库可以使用ADO,ADO.Net,OLEDB,ODBC,跨平台的OCCI等方法,其中速度最快,对Oracle支持最完整的是Oracle提供的OCCI。

OCCI:Oracle C++调用接口(OCCI),即Oracle的C++API,允许你使用面向对象的特性、本地类、C++语言的方法来访问Oracle数据库。

OCCI优势

基于标准C++和面向对象的设计;
效率较高;
适合开发C/S模式的程序,软件中间层;

OCCI特性

完整支持SQL/PLSQL
为不断增长的用户和请求提供了弹性选项
为使用用户自定义类型,如C中的类,提供了无缝接口
支持所有的Oracle数据类型以及LOB types
可以访问数据库元数据
 
  编写 OCCI 程序的总体流程图,如下所示:
                                    
 
环境配置方法
 我们需要以去 Oracle官网下载以下一些组件:
OCCI
Instant Client Package Basic
Instant Client Package SDK

去这个地址http://www.oracle.com/technetwork/database/occidownloads-083553.html下载OCCI,通过这个表格可以看到VS2010之前的IDE都需要安装客户端之后可以进行开发,而对于VS2010并不需要安装Oracle 客户端,只需下载一个组件即可,这里我下载的是vs2010 32bit的11.2.3.0版本。由于Oracle 客户端是向下兼容的,因此使用11版本的客户端可以连接我的10g数据库。接着支这里http://www.oracle.com/technetwork/topics/winsoft-085727.html下载Instant client package basic及intstant client package SDK,需要注意的是这两个组件的版本号也必须为11.2.3.0。

  • 安装instant client package

下面的仿照着上面给出的那篇BLOG做了,将instant_basic解压到D盘,形成了如下的目录结构,d:\instantclient_11_2,下面会有文件及VC8,VC9文件夹,将这两个文件夹删去。将instant_sdk解压,其会在d:\instantclient_11_2目录下生成一个sdk目录,即形如d:\instantclient_11_2\sdk。如果不是的话可以手动调整一下。

  • 安装OCCI

将上面下载的occivc10_11203解压到d:\temp,在D:\instantclient_11_2\sdk\lib\msvc目录下创建VC10目录,形成的目录结构如d:\instantclient_11_1\sdk\lib\msvc\vc10,在d:\instantclient_11_2下新建目录VC10。将d:\instantclient_11_2下的oraocci11.dll及oraocci11.sym删除,因为其与VS2010不兼容。从d:\temp中找到oraocci11.lib及oraocci11d.lib,将这两个文件复制到d:\instantclient_11_2\sdk\lib\msvc\vc10,在从d:\temp找到oraocci11.dll及oraocci11d.dll,将这两个文件复制到d:\instantclient_11_2\VC10,将D:\instantclient_11_2\sdk\lib\msvc下的oraocci11.lib删去。最后的工作是设置环境变量,将d:\instantclient_11_2\vc10及d:\instantclient_11_2加入到path内容的最前面。

  • 配置VS2010

先创建一个工程,选择c++中空工程OracleConnection,生成可执行的程序的格式为dll。然后在solution explorer中右OracleConnection,选择Properties->Configuration Properties–>vc++ Directories,在Include Directories中加上occi.h所在的位置d:\instantclient_11_2\sdk\include,在Library Directories中加上lib文件的目录d:\instantclient_11_2\sdk\lib\msvc\vc10。上面这两个设置完成后还要到Linker下的Input中,在Additional Dependencies的最后面加上oraocci11d.lib(如果是release模式下请用oraocci11.lib)。至此所有配置及安装工作完成了,可以封装OCCI的dll了。

 例: 


#include <iostream>
#include <occi.h>

using namespace oracle::occi;
using namespace std;

int main () 
{
    Environment *env;
    Connection *conn;
    Statement *stmt;
    ResultSet *rs;

    string username = “tmp”;
    string password = “123”;
    string connstring = “172.16.249.3:1521/mj”;
    string sql,strname;
    int isno;

    env = Environment::createEnvironment(); //创建一个环境变量
     conn = env->createConnection(username,password,connstring); //创建一个数据库连接对象
     stmt = conn->createStatement(); //创建一个Statement对象

     sql = “ SELECT sno,sname FROM student “;  //拼接一个SQL语句
     stmt->setSQL(sql); //设置SQL语句到Statement对象中
     try 
    {
        rs =  stmt->executeQuery();//执行SQL语句
          while (rs->next()) 
        { //用循环,一条一条地取得查询的结果记录
            isno = rs->getInt(1);//取出第一列的值(对应为int型)
            strname=rs->getString(2); //取出第二列的值(对应为string型)
            cout << isno << “  AND  “ << strname << endl;
        }
        cout << “SELECT ―― SUCCESS” << endl;
    } 
    catch (SQLException ex) 
    {
        cout << “ Error Number : “<< ex.getErrorCode() << endl; //取出异常代码
          cout << ex.getMessage() << endl; //取出异常信息
     }

    conn->terminateStatement(stmt); //终止Statement对象
     env->terminateConnection(conn); //断开数据库连接
     Environment::terminateEnvironment(env); //终止环境变量

    return 1;
}


 参考资料:

http://blog.csdn.net/xiaobai1593/article/details/6671722

http://blog.csdn.net/echo7l/article/details/6362385

http://www.linuxidc.com/Linux/2012-06/62474p2.htm  

标签: C++ Oracle OCCI
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 3
博文 104
码字总数 14021
评论 (0)
×
_编程菜鸟_
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: