• C++连接Oracle之OCCI(windows)


    上一节我们讲过了ADO连接Oracle,这一节我们尝试通过OCCI的方式,来在windows平台下连接Oracle数据库,下一节讨论在Linux环境下通过OCCI的方式连接远程的Oracle数据库。

       首先说一下Oracle C++ CallInterface (OCCI)是Oracle自带的一套应用程序编程接口,它允许C++程序与一个或者多个Oracle数据库进行交互,OCI虽然开发起来难度大一些,但是它的速度极快,而且是一种底层接口,几乎可以操纵Oracle数据库的任何对象。

    环境:windows7 64bit

    IDE :VS 2010

    服务端:winserver2008  Oracle 12c

    下载开发包:

    首先在Oracle官网下载相应的Cilent开发包,其中包含一些必要的库文件 。一定要下载相对应版本的客户端开发包。我把我的开发包放在了D盘下。

    http://download.csdn.net/detail/u012139536/9561994

    OCCI要访问ORACLE数据库,需要几部分文件:include头文件,lib库文件,dll文件,其实基本步骤是怎么找到这些文件。

    获取这些文件,需要在oracle官网下载几个包:

    1:Instant Client Package - Basic: All files required to run OCI, OCCI, and JDBC-OCI applications

    2:Instant Client Package - SDK: Additional header files and an example makefile for developing Oracle applications with Instant Client

    3:OCCI接口:Oracle C++ Call Interface

    分别下载这三个包:

    1:Instant Client Package - Basic、Instant Client Package - SDK两个包的下载地址:http://www.oracle.com/technetwork/topics/winsoft-085727.html(其他平台:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html)

    选中一个版本,所选版本需要高于oracle数据库的版本;且这两个包的版本要一致。

    2:OCCI接口下载地址:http://www.oracle.com/technetwork/database/occidownloads-083553.html

    选中一个版本,该版本要和前两个包的版本保持一致。从该下载页的表格中可以看出,VS2010提供了zip包,而之前的VS版本则需要安装oracle客户端才能访问数据库,所以使用vs2010就方便多了,只需要相应的库文件即可。

    下载完成后:

    分别解压三个包:

    1:所需的include头文件在instantclient-sdk-nt-11.2.0.4.0instantclient_11_2sdkinclude路径下(Instant Client Package - SDK包)

    2:lib文件在OCCI接口包中:oraocci11.lib或者oraocci11d.lib(SDK包中也有lib文件,但测试发现用不上)

    3:dll文件在OCCI接口包中的:oraocci11.dll或者oraocci11d.dll,以及Instant Client Package - Basic包中的:oraociei11.dll、oci.dll、orannzsbb11.dll(如果orannzsbb11不要也可以,该包下的其他dll、sym、exe文件不用管,至于具体作用还没来得及研究)。

    设置环境变量:

    然后在计算机->右键属性->高级系统设置->环境变量,里设置系统变量

    Path=D:instantclient-basic-nt-12.1.0.2.0instantclient_12_1

    NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

    配置VS2010:

        先创建一个空工程OCCIConnectOracle

    1.  添加库文件目录:

    解决方案中右键OCCIConnectOracle->属性->c/c++->常规->附加包含目录,中输入库目录地址:D:instantclient-sdk-nt-12.1.0.2.0instantclient_12_1sdkinclude

    2.  添加头文件目录:

    属性->链接器->常规->附加库目录:D:instantclient-sdk-nt-12.1.0.2.0instantclient_12_1sdklibmsvcvc10

    3.  添加库文件:

    属性->链接器->输入->附加依赖项:此处有oraocci12.lib和oraocci12d.lib两个文件,其中oraocci12.lib为release模式时使用,oraocci12d.lib为debug模式时使用。

    代码部分:

    1. /***************************采用oracle本身提供OCCI方式操作数据库*******************/  
    2.   
    3. //代码的目的就是验证makefile中oracle的头文件和lib文件路径是否正确了  
    4. #include <iostream>  
    5. #define WIN32COMMON //避免函数重定义错误  
    6. #include <occi.h>  
    7. using namespace std;  
    8. using namespace oracle::occi;  
    9.   
    10.   
    11. int main()  
    12. {  
    13.     system("pause");  
    14.     //创建OCCI上下文环境  
    15.     Environment *env = Environment::createEnvironment();  
    16.     if (NULL == env) {    
    17.             printf("createEnvironment error. ");    
    18.             return -1;    
    19.         }  
    20.     else  
    21.         cout << "success" << endl;  
    22.   
    23.     string name = "system";  
    24.     string pass = "123";  
    25.     string srvName = "192.168.26.74:1521/orcl";  
    26.   
    27.     try  
    28.     {     
    29.         //创建数据库连接  
    30.         Connection *conn = env->createConnection(name, pass, srvName);//用户名,密码,数据库名  
    31.          if(NULL == conn) {    
    32.             printf("createConnection error. ");    
    33.             return -1;    
    34.         }  
    35.          else  
    36.             cout << "conn success" << endl;  
    37.   
    38. //  数据操作,创建Statement对象  
    39.         Statement *pStmt = NULL;    // Statement对象  
    40.         pStmt = conn->createStatement();    
    41.         if(NULL == pStmt) {    
    42.             printf("createStatement error. ");    
    43.             return -1;    
    44.         }   
    45.   
    46.         // 查询数据库时间    
    47.         std::string strTemp;   
    48.         ResultSet *pRs = pStmt->executeQuery(    
    49.             "SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL");    
    50.         while(pRs->next()) {    
    51.             strTemp = pRs->getString(1);    
    52.             printf("db time:%s. ", strTemp.c_str());    
    53.             // int类型取值用getInt()    
    54.             break;    
    55.         }    
    56.         pStmt->closeResultSet(pRs);         
    57.           
    58.         //--------插入---------    
    59.         // 指定DML为自动提交    
    60.         pStmt->setAutoCommit(TRUE);    
    61.         // 设置执行的SQL语句    
    62.         //pStmt->setSQL("INSERT INTO TA (ID, NAME) VALUES (1, 'ZS')");    
    63.         pStmt->setSQL("INSERT INTO TABLE_TEST_WANG (NAME, NUM, AGE) VALUES ('邓超', '99', '41')");  
    64.   
    65.         // 执行SQL语句    
    66.         unsigned int nRet = pStmt->executeUpdate();    
    67.         if(nRet == 0) {    
    68.             printf("executeUpdate insert error. ");    
    69.         }   
    70.   
    71.         // 终止Statement对象    
    72.         conn->terminateStatement(pStmt);   
    73.   
    74. //  关闭连接  
    75.         env->terminateConnection(conn);            
    76.        // pEnv->terminateConnection(pConn);    
    77.     }  
    78.     catch (SQLException e)  
    79.     {  
    80.         cout << e.what() << endl;  
    81.         system("pause");  
    82.         return -1;  
    83.     }  
    84.   
    85.   
    86. // 释放OCCI上下文环境    
    87.     Environment::terminateEnvironment(env);  
    88.     cout << "end!" << endl;  
    89.     system("pause");  
    90.     return 0;  
    91. }  


    效果图:

    程序显示上传数据成功,用SQL Developer查看数据库数据

    可以看到数据库中已经存在,上传成功。

  • 相关阅读:
    POST请求
    怎样在ios开发中设置tableview的cell颜色
    error LNK2005 已经在***.obj中定义
    IOS开发之UIView的基本使用
    [置顶] 浅谈Android的资源编译过程
    IOS开发之UIView总结
    鉴别不使用的索引
    浅谈Jquery的使用下篇
    Go如何使用实现继承的组合
    做一个小淘气轮廓--文章和论文专辑
  • 原文地址:https://www.cnblogs.com/aabbcc/p/5954420.html
Copyright © 2020-2023  润新知