文档章节

C++通过OCCI操作Oracle

_编程菜鸟_
 _编程菜鸟_
发布于 2016/01/27 13:12
字数 1116
阅读 1847
收藏 2

简介

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  

© 著作权归作者所有

共有 人打赏支持
_编程菜鸟_
粉丝 3
博文 105
码字总数 14021
作品 0
武汉
Linux C++、Boost、ACE ......

Linux/UNIX、C++、Boost、ACE、Shell ...... Linux/UNIX C++高级培训---远程班 培养目标:Linux/UNIX C++高级软件工程师 专注Linux/UNIX服务器端的软件开发(后台开发),培养企业所需的专业...

athxy
2010/04/01
0
1
大神有话说之c++,还在迷茫的朋友可以来看一下

C++ 是一种中级语言,它是由 Bjarne Stroustrup 于 1979 年在贝尔实验室开始设计开发的。C++ 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言。C++ 可运行于多种平台上,如 Window...

悟空_b201
05/30
0
0
【C#每日一帖】【转】C#与C++的区别

没有什么语言能比C++更加贴近Windows本身了,这一点也是不可否认的。如果哪一天C#也能写驱动的时候,那么C++就真的会淘汰了(这天可能不会太远又或者很遥远)。 C#能做的,C++不一定都能做,C...

c_o_d_e_r
2011/07/22
0
0
STL list链表的用法详解

------------------------------------------------------------------------------- 原来... STL list链表的用法详解 本文以List容器为例子,介绍了STL的基本内容,从容器到迭代器,再到普通...

nao
2014/04/10
0
0
Java程序员如何高效而优雅地入门C++

Java程序员如何高效而优雅地入门Cpp,由于工作需要,需要用C++写一些模块。关于C++ 的知识结构,虽说我有过快速学习很多新语言的经验,但对于C++ 我也算是老手,但也还需要心生敬畏,本文会从...

小欣妹妹
04/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Cloud Gateway真的有那么差吗?

前言 Spring Cloud从一开始最受大家质疑的就是网关性能,那是由于Spring Cloud最初选择了使用Netflix几年前开源的Zuul作为基础,而高性能版的Zuul 2在经过了多次跳票之后,对于Spring这样的整...

Java小铺
46分钟前
1
0
SpringBoot远程调试,远程debug你的线上项目

开发环境中代码出错了,可以利用IDE的debug功能来进行调试。那线上环境出错呢? 一、假设我们的项目是部署在tomcat中,那我们就需要对tomcat进行一定对配置,配置如下。 1. windows系统中,找...

nonnetta
51分钟前
0
0
JAVA秒杀优化方向

秒杀优化方向 将请求尽量拦截在系统上游:传统秒杀系统之所以挂,请求都压倒了后端数据层,数据读写锁冲突严重,几乎所有请求都超时,流量虽大,下单成功的有效流量甚小,我们可以通过限流、...

小贱是个程序员
59分钟前
0
0
C# 统计字符串中大写字母和小写字母的个数

static void Main() { int count1 = 0; int count2 = 0; Console.WriteLine("请输入字符串"); string str = Convert.ToString(Consol......

熊二的爸爸是谁
今天
0
0
分布式服务框架之远程通讯技术及原理分析

在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,这些名词之间到底是...

老道士
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部