GVKun编程网logo

oracle在linux 下编译oci程序及occi,由于选项次序引起的问题(linux 使用oracle)

25

想了解oracle在linux下编译oci程序及occi,由于选项次序引起的问题的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于linux使用oracle的相关问题,此外,我们还将为您介绍关

想了解oracle在linux 下编译oci程序及occi,由于选项次序引起的问题的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于linux 使用oracle的相关问题,此外,我们还将为您介绍关于C# 使用OCCI 连接Oracle 数据库、c++ 调用 occi 访问 oracle、c++ 调用occi访问oracle、C++通过OCCI操作Oracle的新知识。

本文目录一览:

oracle在linux 下编译oci程序及occi,由于选项次序引起的问题(linux 使用oracle)

oracle在linux 下编译oci程序及occi,由于选项次序引起的问题(linux 使用oracle)

:~/prg/embc/ora$ g++ -I${ORACLE_HOME}/sdk/include  -L${ORACLE_HOME}/lib -lclntsh -o ociTest ociTest.cpp

/tmp/ccb8nVWk.o:在函数‘main’中:

ociTest.cpp:(.text+0xcf):对‘OCIEnvCreate’未定义的引用

ociTest.cpp:(.text+0x14f):对‘OCIHandleAlloc’未定义的引用

ociTest.cpp:(.text+0x175):对‘OCIHandleAlloc’未定义的引用

ociTest.cpp:(.text+0x1be):对‘OCIServerAttach’未定义的引用

ociTest.cpp:(.text+0x22c):对‘OCIErrorGet’未定义的引用

ociTest.cpp:(.text+0x27a):对‘OCIHandleFree’未定义的引用

ociTest.cpp:(.text+0x28e):对‘OCIHandleFree’未定义的引用

ociTest.cpp:(.text+0x2a2):对‘OCIHandleFree’未定义的引用

ociTest.cpp:(.text+0x36b):对‘OCIHandleAlloc’未定义的引用

ociTest.cpp:(.text+0x391):对‘OCIHandleAlloc’未定义的引用

ociTest.cpp:(.text+0x3c1):对‘OCIAttrSet’未定义的引用

ociTest.cpp:(.text+0x3e7):对‘OCIHandleAlloc’未定义的引用

ociTest.cpp:(.text+0x438):对‘OCIAttrSet’未定义的引用

ociTest.cpp:(.text+0x489):对‘OCIAttrSet’未定义的引用

ociTest.cpp:(.text+0x4b1):对‘OCISessionBegin’未定义的引用

ociTest.cpp:(.text+0x514):对‘OCIErrorGet’未定义的引用

ociTest.cpp:(.text+0x562):对‘OCIHandleFree’未定义的引用

ociTest.cpp:(.text+0x576):对‘OCIHandleFree’未定义的引用

ociTest.cpp:(.text+0x58a):对‘OCIHandleFree’未定义的引用

ociTest.cpp:(.text+0x5e0):对‘OCIAttrSet’未定义的引用

ociTest.cpp:(.text+0x611):对‘OCIHandleAlloc’未定义的引用

ociTest.cpp:(.text+0x682):对‘OCIHandleAlloc’未定义的引用

ociTest.cpp:(.text+0x727):对‘OCIStmtPrepare’未定义的引用

ociTest.cpp:(.text+0x824):对‘OCIDefineByPos’未定义的引用

ociTest.cpp:(.text+0x887):对‘OCIDefineByPos’未定义的引用

ociTest.cpp:(.text+0x8b7):对‘OCIAttrGet’未定义的引用

ociTest.cpp:(.text+0x8f5):对‘OCIStmtExecute’未定义的引用

ociTest.cpp:(.text+0x967):对‘OCIStmtFetch2’未定义的引用

ociTest.cpp:(.text+0x9a1):对‘OCIAttrGet’未定义的引用

ociTest.cpp:(.text+0x9f3):对‘OCIHandleAlloc’未定义的引用

ociTest.cpp:(.text+0xa64):对‘OCIHandleAlloc’未定义的引用

ociTest.cpp:(.text+0xb42):对‘OCIStmtPrepare’未定义的引用

ociTest.cpp:(.text+0xbdd):对‘OCIStmtExecute’未定义的引用

ociTest.cpp:(.text+0xbf6):对‘OCILogoff’未定义的引用

ociTest.cpp:(.text+0xc14):对‘OCIServerDetach’未定义的引用

ociTest.cpp:(.text+0xc28):对‘OCIHandleFree’未定义的引用

ociTest.cpp:(.text+0xc3c):对‘OCIHandleFree’未定义的引用

ociTest.cpp:(.text+0xc50):对‘OCIHandleFree’未定义的引用

ociTest.cpp:(.text+0xc64):对‘OCIHandleFree’未定义的引用

collect2: error: ld returned 1 exit status

~/prg/embc/ora$ g++ -o ociTest ociTest.cpp -I${ORACLE_HOME}/sdk/include  -L${ORACLE_HOME}/lib -lclntsh

~/prg/embc/ora$ ./ociTest 

Oracle environment initialization success!

Oracle server attach success!

user session success!

Create stmt success !

Create prepare success!

  

7369 SMITH 

7499 ALLEN 

7521 WARD 

7566 JONES 

7654 MARTIN 

7698 BLAKE 

7782 CLARK 

7788 SCOTT 

7839 KING 

7844 TURNER 

7876 ADAMS 

7900 JAMES 

7902 FORD 

7934 MILLER 

 rows :14

Create stmt success !

Create prepare success!

 

ociTest.cpp

// g++ -I${ORACLE_HOME}/sdk/include -o ociTest ociTest.cpp -L${ORACLE_HOME}/lib -lclntsh
#include <oci.h>
#include <iostream>
#include <string>
#include <string.h>
#include <stdlib.h>
using namespace std;

//存放查询数据的结构体
struct result
{
    char ename[20];
    char cname[20];
    result()
    {
        memset(ename, ''\0'', sizeof(ename));
        memset(cname, ''\0'', sizeof(cname));
    }
};
 
int main()
{
    // 初始化 OCI 环境句柄指针
    OCIEnv *envhpp = NULL;
    // 初始化服务器句柄
    OCIServer *servhpp = NULL;
    // 用于捕获 OCI 错误信息
    OCIError *errhpp = NULL;
    // 初始化会话句柄
    OCISession *usrhpp = NULL;
    // 初始化服务上下文句柄
    OCISvcCtx *svchpp = NULL;
    // 初始化表达式句柄
    OCIStmt *stmthpp = NULL;
 
    string server="winorcl";
 
    // 创建 OCI 环境 , 并设置环境句柄。
    sword swResult = OCIEnvCreate(&envhpp, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL);
    if (swResult != OCI_SUCCESS && swResult != OCI_SUCCESS_WITH_INFO)
    {
        cout << "Oracle environment initialization error!" << endl;
        exit(1);
    }
    cout << "Oracle environment initialization success!" << endl;
 
    // 创建错误句柄
    OCIHandleAlloc((dvoid *)envhpp, (dvoid **)&errhpp, OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0);
 
    // 创建服务句柄
    OCIHandleAlloc((dvoid *)envhpp, (dvoid **)&servhpp, OCI_HTYPE_SERVER, (size_t)0, (dvoid **)0);
 
    // 连接服务器,如果失败则获取错误码
    if (OCIServerAttach(servhpp, errhpp, (text *)server.c_str(), strlen(server.c_str()), 0) != OCI_SUCCESS)
    {
        int errcno;
        char errbuf[512] = "";
        sb4 errcode;
 
        // 获取错误指针和 OCI 错误代码
        OCIErrorGet((dvoid *)errhpp, (ub4)1, (text *)NULL, &errcode, (ub1 *)errbuf, (ub4)sizeof(errbuf), OCI_HTYPE_ERROR);
        errcno = errcode;
 
        cout << "Oracle server attach error:" << errbuf << endl;
        OCIHandleFree((dvoid *)envhpp,OCI_HTYPE_ENV);
        OCIHandleFree((dvoid *)servhpp,OCI_HTYPE_SERVER);
        OCIHandleFree((dvoid *)errhpp,OCI_HTYPE_ERROR);
        exit(1);
    }
    cout << "Oracle server attach success!"<< endl;
 
    /***************** 连接数据库 ****************/
    string user = "scott";
    string pas = "tiger";
    errhpp = NULL;
 
    // 创建错误句柄
    (void) OCIHandleAlloc((dvoid *)envhpp, (dvoid **)&errhpp, OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0);
    // 创建服务上下文句柄
    (void) OCIHandleAlloc((dvoid *)envhpp, (dvoid **)&svchpp, OCI_HTYPE_SVCCTX, (size_t) 0, (dvoid **)0);
    // 设置属性
    (void) OCIAttrSet((dvoid *)svchpp, OCI_HTYPE_SVCCTX, (dvoid *)servhpp, (ub4)0, OCI_ATTR_SERVER, (OCIError *)errhpp);
    // 创建用户连接句柄
    (void) OCIHandleAlloc((dvoid *)envhpp, (dvoid **)&usrhpp, (ub4)OCI_HTYPE_SESSION, (size_t) 0, (dvoid **)0);
    // 设置用户名、密码
    (void) OCIAttrSet((dvoid *)usrhpp, (ub4)OCI_HTYPE_SESSION, (dvoid *)user.c_str(), (ub4)strlen(user.c_str()), (ub4)OCI_ATTR_USERNAME, errhpp);
    (void) OCIAttrSet((dvoid *)usrhpp, (ub4)OCI_HTYPE_SESSION, (dvoid *)pas.c_str(), (ub4)strlen(pas.c_str()), (ub4)OCI_ATTR_PASSWORD, errhpp);
 
    // 创建会话连接
    if(OCISessionBegin(svchpp, errhpp, usrhpp, OCI_CRED_RDBMS, (ub4)OCI_DEFAULT) != OCI_SUCCESS)
    {
        int errcno;
        char errbuf[512]={''\0''};
        sb4 errcode;
        
        // 获取错误指针和 OCI 错误代码
        OCIErrorGet((dvoid *)errhpp, (ub4)1, (text *)NULL, &errcode, (ub1 *)errbuf, (ub4)sizeof(errbuf), OCI_HTYPE_ERROR);
        errcno = errcode;
        cout << "User session error:" << errbuf << endl;
        OCIHandleFree((dvoid *)errhpp,OCI_HTYPE_ERROR);
        OCIHandleFree((dvoid *)usrhpp,OCI_HTYPE_SESSION);
        OCIHandleFree((dvoid *)svchpp,OCI_HTYPE_SVCCTX);
        exit(1); 
    }
    cout << "user session success!" << endl;
    
    (void) OCIAttrSet((dvoid *)svchpp, (ub4) OCI_HTYPE_SVCCTX, (dvoid *)usrhpp, (ub4)0, (ub4)OCI_ATTR_SESSION, errhpp);
 
    /*************** 执行 查询SQL 语句 ******************/
    errhpp = NULL;
 
    // 创建一个表达式句柄
    if (OCIHandleAlloc((dvoid *)envhpp, (dvoid **)&stmthpp, OCI_HTYPE_STMT, (size_t)0, (dvoid **)0) != OCI_SUCCESS)
    {
        cout << "Create STMT error !" << endl;
        exit(1);
    }
    cout << "Create stmt success !" << endl;
    
    // 创建错误句柄
    OCIHandleAlloc((dvoid *)envhpp, (dvoid **)&errhpp, OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0);
    
    // Select语句
    char sql[255] = "select EMPNO,ENAME from emp ";
    
    if (OCIStmtPrepare(stmthpp, errhpp, (text *)sql, (ub4)strlen(sql), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT) != OCI_SUCCESS)
    {
         cout << "Create prepare error!" << sql << endl;
         exit(1);
    }
    cout << "Create prepare success!" << endl;
 
    /********* 绑定参数 ***********/
    // 申请绑定字段的句柄
    OCIDefine *bhp1 = NULL;
    OCIDefine *bhp2 = NULL;
    
    // 存放数据的结构
    struct result rst;
    
    // 指定提取数据长度
    ub2 datalen = 0;
    // 定义指示器变量 , 用于取可能存在空值的字段
    char isnul[6] = "";
    // 定义输出变量 ,
    OCIDefineByPos(stmthpp, &bhp1, errhpp, 1, (dvoid *)&rst.ename, sizeof(rst.ename), SQLT_CHR, NULL, &datalen, NULL, OCI_DEFAULT);
    OCIDefineByPos(stmthpp, &bhp2, errhpp, 2, (dvoid *)&rst.cname, sizeof(rst.cname), SQLT_STR, NULL, &datalen, NULL, OCI_DEFAULT);
 
    // 获取 SQL 语句类型
    ub2 stmt_type;
    OCIAttrGet ((dvoid *)stmthpp, (ub4)OCI_HTYPE_STMT, (dvoid *)&stmt_type, (ub4 *)0, (ub4)OCI_ATTR_STMT_TYPE, errhpp);
    
    // 执行 SQL 语句
    OCIStmtExecute(svchpp, stmthpp, errhpp, (ub4)0, (ub4)0, (OCISnapshot *)NULL, (OCISnapshot *)NULL, OCI_DEFAULT);
 
    // 获取查询信息
    int rows_fetched;
    do
    {
        cerr << rst.ename<< " ";
        cerr << rst.cname<< " \n";
    }
    while(OCIStmtFetch2(stmthpp, errhpp, 1, OCI_FETCH_NEXT, 1, OCI_DEFAULT) != OCI_NO_DATA);
 
    // 获得记录条数
    OCIAttrGet((CONST void *)stmthpp, OCI_HTYPE_STMT, (void *)&rows_fetched, (ub4 *)sizeof(rows_fetched), OCI_ATTR_ROW_COUNT, errhpp);
    cout << " rows :" << rows_fetched << endl;
 
    /*************** 执行 新增SQL 语句 ******************/
    if (OCIHandleAlloc((dvoid *)envhpp, (dvoid **)&stmthpp, OCI_HTYPE_STMT, (size_t)0, (dvoid **)0) != OCI_SUCCESS)
    {
        cout << "Create STMT error !" << endl;
        exit(1);
    }
    cout << "Create stmt success !" << endl;
 
    OCIHandleAlloc((dvoid *)envhpp, (dvoid **)&errhpp, OCI_HTYPE_ERROR, (size_t)0, (dvoid **)0);
 
    // Insert语句
    char sql2[255] = "insert into emp (EMPNO,ENAME) values(7900 , ''testoci'')";
    
    // 准备Sql语句
    if (OCIStmtPrepare(stmthpp, errhpp, (text *)sql2, (ub4)strlen(sql2), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT) != OCI_SUCCESS)
    {
         cout << "Create prepare error!" << sql2 << endl;
         exit(1);
    }
    cout << "Create prepare success!" << endl;
    
    // 执行SQL 语句
    OCIStmtExecute(svchpp, stmthpp, errhpp, (ub4)1, (ub4)0, (OCISnapshot *)NULL, (OCISnapshot *)NULL, OCI_DEFAULT);

    // 断开用户会话
    OCILogoff(svchpp, errhpp);
    
    // 断开服务器连接
    OCIServerDetach(servhpp, errhpp, OCI_DEFAULT);
    
    // 释放资源
    OCIHandleFree((dvoid *) stmthpp, OCI_HTYPE_STMT);
    OCIHandleFree((dvoid *) svchpp, OCI_HTYPE_SVCCTX);
    OCIHandleFree((dvoid *) servhpp, OCI_HTYPE_SERVER);
    OCIHandleFree((dvoid *) errhpp, OCI_HTYPE_ERROR);
 
    return 0;
}

occi的次序:

代码:

// g++-4.8 -I${ORACLE_HOME}/sdk/include -o occi1 occi1.cpp -L${ORACLE_HOME}/lib -lclntsh -locci


#include <iostream>
#include <string>
#include <occi.h>
using namespace oracle::occi;
using namespace std;

int main()
{
        string usr="scott";
        string pwd="tiger";
        string SID="xe";
        string date;

        Environment *env=Environment::createEnvironment(Environment::OBJECT);
        Connection *conn= env->createConnection(usr,pwd,SID);//all strings
        if(conn)
                cout<<"success createConnection!"<<endl;
        else
                cout<<"failure createConnection!"<<endl;

        Statement *stmt = conn->createStatement();
        string sSQL = "select to_char(sysdate,''yyyy-mm-dd hh24:mi:ss'') from dual";
        stmt->setSQL(sSQL);


        ResultSet *rs = stmt->executeQuery();
        if(rs->next())
        {
                date = rs->getString(1);
        }

        cout<<"now time :"<<date<<endl;

        env->terminateConnection(conn);
        Environment::terminateEnvironment(env);

        return 0;
}

运行:

$ g++-4.8 -I${ORACLE_HOME}/sdk/include -o occi1 occi1.cpp -L${ORACLE_HOME}/lib -locci -lclntsh
$ ./occi1
./occi1: symbol lookup error: /mnt/c/ora11g/instantclient_11_2/lib/libocci.so.11.1: undefined symbol: OCIEnvCreate

$ g++-4.8 -I${ORACLE_HOME}/sdk/include -o occi1 occi1.cpp -L${ORACLE_HOME}/lib -lclntsh -locci
$ ./occi1
success createConnection!
now time :2021-10-19 08:45:51

备注:

由于OCCI库是在gcc-4下编译,在高版本的gcc上编译后,程序执行会崩溃。所以我们需要为系统安装g++-4.8:在低于18.04下直接安装:

 sudo apt install g++-4.8

而在20.04下由于g++-4.8源已经被移除了,需要手工下载如下包并安装:

gcc-4.8-base_4.8.5-4ubuntu9_amd64.deb  libgcc-4.8-dev_4.8.5-4ubuntu9_amd64.deb
cpp-4.8_4.8.5-4ubuntu9_amd64.deb  gcc-4.8_4.8.5-4ubuntu9_amd64.deb       libstdc++-4.8-dev_4.8.5-4ubuntu9_amd64.deb
g++-4.8_4.8.5-4ubuntu9_amd64.deb  libasan0_4.8.5-4ubuntu9_amd64.deb

地址:http://old-releases.ubuntu.com/ubuntu/pool/universe/g/gcc-4.8/

安装命令:

sudo dpkg -i *.deb

 

C# 使用OCCI 连接Oracle 数据库

C# 使用OCCI 连接Oracle 数据库

最近因需要研究了一下C#向Oracle数据库中插入数据的问题,通常情况下使用微软自带的组件ADO.NET来连接并操作数据库,这也是最简便

最近因需要研究了一下C#向Oracle数据库中插入数据的问题,通常情况下使用微软自带的组件ADO.NET来连接并操作数据库,这也是最简便的方式,用法也比较简单,即在程序开头加上using System.Data.OracleClient。另外就是使用Oracle提供的ODP.net,这需要下载ODAC,并在程序中引用Oracle.DataAccess.dll。

接下来写程序测试向数据库中插入记录的速度了,首先尝试使用ADO.net。

部分代码如下:

C#程序运行在Windows Server 2008 32位上,机器为Xeon E552O * 2,2.27Ghz,共16核内存12GB。Oracle 安装在RedHat AS4U4,cpu为AMD Opterron 275 * 2 ,2.2GHz,共4核心,,内存16GB,oracle 10g。
测试结果为33秒左右,每秒插入不到700条,之后也采用了绑定变量及调用存储过程等方法,插入速度也没有多大提高。

于是想到了用ODP.net,在网上查到说ODAC的版本必须与安装的oracle对应,虽然这个要求感觉不太灵活,因为实际的使用环境可能与开发环境不一致,到时还要更换ODAC的版本,且ODAC在官网上并不是能对应上所有的Oracle版本。在网上看到使用ODP.net插入速度可以达到数万条每秒,但我多次尝试时,都在运行时出现问题,根本无法运行成功。于是便放弃了。Oracle与MS的东西兼容性不强,或者说是Oracle本身向下兼容的能力弱,真是令人抓狂。

多方查找后发现了OCI这个东西,于是想到了使用封装了OCI的OCCI,这样眼前突然一亮。之后的思路就很清淅了,先用c++做一个dll,里面的函数是对OCCI的进行一步封装,再用c#调用这个dll就可以了。下面就是实现的具体过程了。

linux

c++ 调用 occi 访问 oracle

c++ 调用 occi 访问 oracle

//头文件
#include "stdafx.h"
#include "occi.h" 
#include "occiCommon.h" 
#include "occiControl.h" 
#include "occiData.h" 
#include "occiObjects.h" 
#pragma  comment (lib,"../../Lib/2010/oraocci11.lib"
using namespace oracle::occi; 


class OcciConection { 
public: 
    OcciConection(); 
    virtual ~OcciConection(); 
    BOOL ExcuteSql(CString strSql); 
    BOOL Conection(); 
    void OcciDisConection(); 
    CString strUser; 
    CString strPasswd; 
    CString strDatabase; 
private: 
    oracle::occi::Environment *env; 
    oracle::occi::Connection  *conn; 
};
//实现代码
#include "stdafx.h"
#include "OcciFunction.h"






OcciConection::OcciConection()
{
}
OcciConection::~OcciConection()
{
}
BOOL OcciConection::Conection()
{
    CStringA straUser(strUser.GetBuffer(0));
    strUser.ReleaseBuffer();
    std::string user=straUser.GetBuffer(0);
    straUser.ReleaseBuffer();

    CStringA straPasswd(strPasswd.GetBuffer(0));
    strPasswd.ReleaseBuffer();
    std::string passwd=straPasswd.GetBuffer(0);
    straPasswd.ReleaseBuffer();

    CStringA straDatabase(strDatabase.GetBuffer(0));
    strDatabase.ReleaseBuffer();
    std::string database=straDatabase.GetBuffer(0);
    straDatabase.ReleaseBuffer();

    env = Environment::createEnvironment();
    try
    {
        conn = env->createConnection(user, passwd, database);
    }
    catch (SQLException& ex)
    {
        std::string error=ex.getMessage();
        return FALSE;
    }
    return TRUE;
}

void OcciConection::OcciDisConection()
{
    env->terminateConnection (conn);
    Environment::terminateEnvironment (env);
}

BOOL OcciConection::ExcuteSql(CString strSql)
{
    try
    {
        CStringA straSql(strSql.GetBuffer(0));
        strSql.ReleaseBuffer();
        std::string sql=straSql.GetBuffer(0);
        straSql.ReleaseBuffer();
        
        Statement *stmt = conn->createStatement(sql);
        stmt->executeUpdate();
        conn->terminateStatement(stmt);
    }
    catch (SQLException& ex)
    {
        std::string error=ex.getMessage();
        return FALSE;
    }
    return TRUE;
}


c++ 调用occi访问oracle

c++ 调用occi访问oracle

//头文件
#include "stdafx.h"
#include "occi.h" 
#include "occiCommon.h" 
#include "occiControl.h" 
#include "occiData.h" 
#include "occiObjects.h" 
#pragma  comment (lib,"../../Lib/2010/oraocci11.lib") 
using namespace oracle::occi; 


class OcciConection { 
public: 
    OcciConection(); 
    virtual ~OcciConection(); 
    BOOL ExcuteSql(CString strSql); 
    BOOL Conection(); 
    void OcciDisConection(); 
    CString strUser; 
    CString strPasswd; 
    CString strDatabase; 
private: 
    oracle::occi::Environment *env; 
    oracle::occi::Connection  *conn; 
};
//实现代码
#include "stdafx.h"
#include "OcciFunction.h"






OcciConection::OcciConection()
{
}
OcciConection::~OcciConection()
{
}
BOOL OcciConection::Conection()
{
    CStringA straUser(strUser.GetBuffer(0));
    strUser.ReleaseBuffer();
    std::string user=straUser.GetBuffer(0);
    straUser.ReleaseBuffer();

    CStringA straPasswd(strPasswd.GetBuffer(0));
    strPasswd.ReleaseBuffer();
    std::string passwd=straPasswd.GetBuffer(0);
    straPasswd.ReleaseBuffer();

    CStringA straDatabase(strDatabase.GetBuffer(0));
    strDatabase.ReleaseBuffer();
    std::string database=straDatabase.GetBuffer(0);
    straDatabase.ReleaseBuffer();

    env = Environment::createEnvironment();
    try
    {
        conn = env->createConnection(user, passwd, database);
    }
    catch (SQLException& ex)
    {
        std::string error=ex.getMessage();
        return FALSE;
    }
    return TRUE;
}

void OcciConection::OcciDisConection()
{
    env->terminateConnection (conn);
    Environment::terminateEnvironment (env);
}

BOOL OcciConection::ExcuteSql(CString strSql)
{
    try
    {
        CStringA straSql(strSql.GetBuffer(0));
        strSql.ReleaseBuffer();
        std::string sql=straSql.GetBuffer(0);
        straSql.ReleaseBuffer();
        
        Statement *stmt = conn->createStatement(sql);
        stmt->executeUpdate();
        conn->terminateStatement(stmt);
    }
    catch (SQLException& ex)
    {
        std::string error=ex.getMessage();
        return FALSE;
    }
    return TRUE;
}


C++通过OCCI操作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  

今天关于oracle在linux 下编译oci程序及occi,由于选项次序引起的问题linux 使用oracle的介绍到此结束,谢谢您的阅读,有关C# 使用OCCI 连接Oracle 数据库、c++ 调用 occi 访问 oracle、c++ 调用occi访问oracle、C++通过OCCI操作Oracle等更多相关知识的信息可以在本站进行查询。

本文标签: