visual studio 2013使用OCCI连接oracle数据库全过程解析

一.版本问题

结合这篇博文自己重新做了个总结

visual studio 2017使用OCCI连接oracle数据库全过程解析

https://www.cnblogs.com/steval/articles/6831454.html

首先,连接oracle数据库有四种方法,OLDODBC,oracle developer tools for visual studio(ODT,这个是需要在oracle官网上下载相关的软件支持的),最后一种方法就是今天要演示的使用OCCI连接oracle数据库。前面的三种方法都是用.net框架去连接,最后一种使用的是C++的方式。

  据某篇博客说,OCCI的连接方式是这几种连接方式中最好的一种

首先需要确定你是用的oracle的版本,因为这将决定你是用的VS版本和OCCI软件包版本。我在项目中使用的是oracle12C 12.1.0.2这个版本(注意64位和32位),这个版本中instant client是oracle数据库的客户端,用来连接使用的。OCCI软件包就在其中(这是后话了)。你确定要了oracle版本后,就确定好instant client的版本(注意64位和32位),你先下载下来,看下这个软件包中使用的是VC几的版本。这个VC版本将决定你是用的VS的版本。

VC8 -- VS2005
VC9 -- VS2008
VC10 -- VS2010
VC11 -- VS2012
VC12 -- VS2013
VC14 -- VS2015           

Version 12.2.0.1.0  VC14
Version 12.1.0.2.0  VC10、11、12
Version 12.1.0.1.0  VC10、11
Version 11.2.0.4.0  VC8、9 (10)
Version 11.2.0.3.0  VC8、9 (10) 10需要再下载另外的OCCI
Version 11.2.0.2.0  VC8、9 (10)
Version 11.2.0.1    VC8、9
Version 11.1.0.7.0  VC71、8
Version 11.1.0.6.0  VC71、8
Version 10.2.0.4    VC7、71
也就是oracleVersion 12.1.0.2.0可以在VS2010,VS2012,VS2013下使用。在别的VS下就不能用了。在VS2013中配置occi 的附加包含文件和库目录时特别要注意选择的VC版本12。

下载和配置环境过程 可以参考上面的那个博文。

(1)还有一个X32 和X64的问题:如果我的Oracle Client是64位的,那么就需要64位的OCCI(下载64位的Oracle Client),并且,在VS中,程序也需要以64位的方式进行编译连接。(2)附加依赖项中输入的oraocci12d.lib和oraocci12.lib,一定要oraocci12d.lib在前面!!因为我用的是debug下面的,要不然在后面测试的时候就会出现这个问题

visual studio 2013使用OCCI连接oracle数据库全过程解析_第1张图片

(3)因为visual studio 2013使用OCCI连接oracle数据库全过程解析_第2张图片有三个版本的VC,在设置PATH时是全部加上去的,不知道为啥我在运行程序的时候配置好VS2010运行没错,配置好VS2013运行就会出现未能与oraocci12d.dll连接,内存出错,可能是访问的dll文件系统不能自动区分是在哪个VC下的吧,我就把PATH改为G:\oracle12c\instantclient-basic-windows.x64-12.1.0.2.0\instantclient_12_1\vc12就好了。

二.关于oracle数据库的简单使用 及为与C++连接测试做准备

要先在oracle中建立好数据库,表空间,用户,表格,然后才能在C++中进行表格插入测试是否连接成功

结合这几个帖子才有了这个总结流程:

https://www.cnblogs.com/fighter007/p/8269238.html

https://www.cnblogs.com/fighter007/p/8287780.html

https://blog.csdn.net/river_continent/article/details/78964627

https://blog.csdn.net/qq_29229567/article/details/79247458

https://blog.csdn.net/chuan_zhang_ak/article/details/80831539 

  • 创建表的流程:对数据库的开发实质是在表中进行开发,但是创建表的过程环环相扣,相关教程都没有完整的说明这一过程,造成很多弯路。
  1. 创建数据库:在创建数据库wang;visual studio 2013使用OCCI连接oracle数据库全过程解析_第3张图片登陆:用户:system 密码:管理口令 -打开该数据库wang
  2. 数据库实例(SID):wang。数据库实例用于对外部连接。在操作系统中要取得与数据库的联系,必须使用数据库实例名。我们作开发,要连接数据库,就得连接数据库实例名: localhost:1521:orcl(orcl就为数据库实例名)。
  3. 表空间:有了数据库就能够创建表空间,每个数据库至少有一个表空间(称作SYSTEM表空间)。Oracle数据库是通过表空间来存储物理表的,一个数据库实例可以有N个表空间,一个表空间只能属于一个数据库。创建语法:Create TableSpace 表空间名称  DataFile   表空间数据文件路径   Size  表空间初始大小  Autoextend on;
  4. 一般需要创建一个默认的表空间和临时表空间

5.用户:Oracle数据库建好后,要想在数据库里建表,必须先为数据库建立用户,并为用户指定表空间。CREATE USER 用户名 IDENTIFIED BY 密码  DEFAULT TABLESPACE 表空间(默认USERS)  TEMPORARY TABLESPACE 临时表空间(默认TEMP) ;授权grant connect,resource,dba to 用户名;这上面四个步骤都在这个页面里面写的命令,创建完用户wdy1之后就要在这个用户里面创建表了

6.有了数据库,表空间和用户,就可以用自定义的用户在自己的表空间创建表了。有了表,就可以开发了。 对表的创建在这个博主的文章中写的很详细https://www.cnblogs.com/fighter007/p/8287780.html

需要注意的是 我创建了这个数据库,就在这个里面进行操作了,不要换来换去,如果再重新创建一个数据库,之前的数据库操作就会出问题了,所以要采用当下的数据库。

三.连接测试

代码:

#include
#define WIN32COMMON //避免函数重定义错误
#include
#include
using namespace std;
using namespace oracle::occi;


int main()
{
    system("pause");
    //创建OCCI上下文环境
    Environment *env = Environment::createEnvironment();
    if (NULL == env) {
        printf("createEnvironment error.\n");
        return -1;
    }
    else
        cout << "success" << endl;

    string name = "wdy1";
    string pass = "wdy1";
    string srvName = "wang";

    try
    {
        //创建数据库连接
        Connection *conn = env->createConnection(name, pass, srvName);//用户名,密码,数据库实例名 SID(一般就是数据库的名字)
        if (NULL == conn) {
            printf("createConnection error.\n");
            return -1;
        }
        else
            cout << "conn success" << endl;

        // 数据操作,创建Statement对象
        Statement *pStmt = NULL; // Statement对象
        pStmt = conn->createStatement();
        if (NULL == pStmt) {
            printf("createStatement error.\n");
            return -1;
        }

        // 查询数据库时间
        string strTemp;
        ResultSet *pRs = pStmt->executeQuery("SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL");
        while (pRs->next()) {
            strTemp = pRs->getString(1);
            cout << strTemp << endl;
            printf("db time:%s.\n", strTemp.c_str());
            // int类型取值用getInt()
            break;
        }
        pStmt->closeResultSet(pRs);

        //--------插入---------
        // 指定DML为自动提交
        pStmt->setAutoCommit(TRUE);
        // 设置执行的SQL语句
        //pStmt->setSQL("INSERT INTO TA (ID, NAME) VALUES (1, 'ZS')");
        //pStmt->setSQL("INSERT INTO STUDENTINFO (STUDENTID, STUDENTNAME, STUDENTSEX, STUDENTAGE, STUDENTTEL, STUDENTADDRESS,  CLASSID) VALUES (5, '张山', '男', 15, '13789895566', '北京',5);");
        //pStmt->setSQL("INSERT INTO STUDENTINFO VALUES(5,'赵丽','女','20','18827650549','郑州',5)");
    //    pStmt->setSQL("INSERT INTO TABLE_TEST_WANG3 (NUM,MINGZI,AGE) VALUES ('01', '邓超', '41')");
        pStmt->setSQL("INSERT INTO TEST001 (CLASSNUM,CLASSTAG) VALUES ('05', '测试五班')");// 设置执行的SQL语句
        //执行SQL语句
        unsigned int nRet = pStmt->executeUpdate();
        if (nRet == 0) {
            printf("executeUpdate insert error.\n");
        }
        // 终止Statement对象
        conn->terminateStatement(pStmt);

        // 关闭连接
        env->terminateConnection(conn);
        // pEnv->terminateConnection(pConn);
    }
    catch (SQLException e)
    {
        cout << e.what() << endl;
        system("pause");
        return -1;
    }


    // 释放OCCI上下文环境
    Environment::terminateEnvironment(env);
    cout << "end!" << endl;
    system("pause");
    return 0;
}

原表格,我自己在里创建的visual studio 2013使用OCCI连接oracle数据库全过程解析_第4张图片

插入操作后程序运行visual studio 2013使用OCCI连接oracle数据库全过程解析_第5张图片

查看visual studio 2013使用OCCI连接oracle数据库全过程解析_第6张图片

连接成功!!

你可能感兴趣的:(visual studio 2013使用OCCI连接oracle数据库全过程解析)