文档章节

C++通过OCCI操作Oracle

_编程菜鸟_
 _编程菜鸟_
发布于 2016/01/27 13:12
字数 1116
阅读 2015
收藏 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
武汉
私信 提问
Oracle的C++调用接口(OCCI)

以前研究过一些数据库接口,比如OCI,今天又特意研究了OCCI,OCCI是在OCI的基础上封装的一层面向C++开发者的一套类库,采用面向对象的方法组织,而OCI是C语言接口,函数调用相当复杂,并且封...

长平狐
2013/12/25
544
0
OCCI上载空间数据

众所周知,数据是GIS的血液,一个GIS系统最重要的是数据,而且在整个系统的建设过程中的花费也比较大。为此,许多GIS厂商和数据库厂商逐渐推出空间数据的存储解决方案。 其中Oracle Spatial是...

长平狐
2013/12/25
116
0
Oracle Spatial研究

Oracle Spatial是Oracle公司推出的空间数据库组件,通过Oracle数据库系统存储和管理空间数据。 Oracle从9i开始对空间数据提供了较为完备的支持。 由于Oracle Spatial本身是ORACLE数据库的一个...

长平狐
2013/12/25
272
0
列一份跨平台开发的读书清单[C/C++ (or Java?)]

如果要开一份跨平台开发的读书清单: 0. 深入理解计算机系统 将它列为0,实在是因为它是一本从程序员的角度去解释一个计算机系统。它解释了一些最基本的东西。 1. Unix环境高级编程 如果觉得...

晨曦之光
2012/04/12
155
0
ODB 2.4.0 发布,C++ 的 ORM 框架

ODB C++ ORM 2.4.0 发布,ODB 是一个开源的,支持多平台,支持多数据库的 C++ 的 ORM 框架,可将 C++ 对象数据库表映射,进行轻松的数据库查询和操作。 该版本主要改进内容包括: 支持 Orac...

oschina
2015/02/12
3.3K
2

没有更多内容

加载失败,请刷新页面

加载更多

阿里云vpc、快照、镜像、重置密码_重启_关机、磁盘扩容

VPC 专有网络VPC(Virtual Private Cloud)是用户基于阿里云创建的自定义私有网络, 不同的专有网络之间二层逻辑隔离,用户可以在自己创建的专有网络内创建和管理云产品实例,比如ECS、负载均...

李超小牛子
15分钟前
0
0
阿里高级技术专家:研发效能的追求永无止境

背景 大约在5年前,也就是2013年我刚加入阿里的时候,那个时候 DevOps 的风刚吹起来没多久,有家公司宣称能够一天发布几十上百次,这意味着相比传统软件公司几周一次的发布来说,他们响应商业...

阿里云官方博客
44分钟前
1
0
Android 的 ViewModel 机制源码解析

Android ViewModel 的好处是会随 Activity 销毁调用它的 clear() 方法。 我们分析一下它是怎么做到的。 1. 例子使用: a、 创建类 TestMvvmViewModel 继承 ViewModel,重写 onCleared() ,把...

亭子happy
54分钟前
2
0
WEB 开发总结

事务处理 事务的4个基本特征 1.Atomic(原子性),事务中包含的操作被看做是一个整体的业务单元,这个业务单元中的操作要么全部成功,要么全部失败,不会出现部分成功,部分失败的场景。 2....

北漂的我
今天
3
0
thinkphp5 利用七牛云 将amr格式语音文件转为mp3

$card_id 是我的本地的文件 将问价名字的后缀名去掉注意access_token的有效期public function ceshi1($card_id){ $mediaid = substr($card_id, 0, -4); $accessKey = ...

小小小壮
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部