visual studio 2017使用OCCI连接oracle数据库

因为项目要使用到VS连接oracle数据库,所以有了这篇博文。

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

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

  Visual Studio 6 : vc6
  Visual Studio 2003 : vc7
  Visual Studio 2005 : vc8
  Visual Studio 2008 : vc9
  Visual Studio 2010 : vc10
  Visual Studio 2012 : vc11
  Visual Studio 2013 : vc12
  Visual Studio 2015 : vc14

  至于我所使用的visual studio 2017,在安装这2017的过程中,你会发现他所使用的VC版本是141,也就是14.1,为了安全起见,我在安装vs2017的过程中,勾选了对vs2015工具包(v140)的支持,所以使用vs2017是没有问题的。

  http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html    数据库从这里下载

  http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html   instant client从这里下载,注意x64,x86和对应oracle的版本

  对于instant client 你需要下载的是 SDK 和 Basic两个软件包,对于我来说如下图

visual studio 2017使用OCCI连接oracle数据库_第1张图片

 

  下载完数据库之后,将数据库安装好,instant client解压得到以下文件

visual studio 2017使用OCCI连接oracle数据库_第2张图片

  注意到,这个instant client使用的是VC14。

 如果你不想运行的时候把DLL拷贝到VS工作目录中取,那么请设置系统环境变量PATH来引导系统找到这些DLL

visual studio 2017使用OCCI连接oracle数据库_第3张图片

 

 

之后进入到visual studio操作。

在C/C++=》附加包含目录 中添加\sdk\include目录

 在链接器=》常规=》附加库目录 中添加lib文件目录 \sdk\lib\msvc\vc14

在链接器=》输入=》附加依赖项 中添加上lib的名字,需要注意的是,文件中有两个lib,一个是oraocci12.lib,另一个是oraocci12d.lib文件。第一个lib文件是用在release模式的,第二个lib文件是用在debug模式的。

我的项目是x64,debug模式,所以只需要在附加依赖项中添加第二个用于debug模式的DLL文件。在选好之后,运行程序,你可能会缺少两个DLL文件,分别是msvcr120d.dll 和 msvcp120d.dll 这两个DLL文件,需要指出的是,这两个DLL文件需要时64位的

https://www.dll-files.com/msvcr120d.dll.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;
}

 

 

参考:

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

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

你可能感兴趣的:(oracle)