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


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

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

  据某篇博客说,OCCI的连接方式是这几种连接方式中最好的一种,我表示,很赞同!!!

  我开始使用的是ODT的方式,也就是从oracle的官网上下载ODT的软件包,要下载对应oracle数据库的ODT软件包,然后通过VS中工具-》连接到数据库这个选项连接,这个方法要配置.osr文件,具体什么记不得了。但是这个方法我一直出现一个错误ORA-12154: TNS: 无法解析指定的连接标识符,具体的解决方案是,我也不知道。反正到最后我也没有解决,下次有时间在来研究一下这个解决方案吧。

  接下来就介绍我如何通过OCCI成功连接上oracle的吧。

  首先需要确定你是用的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两个软件包,对于我来说如下图

 

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

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

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

  顺便说一下,VS中对DLL的调用顺序是

1.      当前进程的可执行模块所在的目录。

2.      当前目录。

3.      Windows 系统目录。GetSystemDirectory 函数检索此目录的路径。(system32 和 syswow64)

这里需要特别指出的是对64位操作系统而言,system32是存放64位的DLL,syswow64存放的是32位的DLL。

4.      Windows 目录。GetWindowsDirectory 函数检索此目录的路径。

5.      PATH 环境变量中列出的目录。

 

  之后进入到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位的,因为项目是64位的。为了下载这两个64位的DLL,我可是煞费苦心,我可以很负责任的告诉你,msvcr120d.dll 64位这个DLL你是百度不到的。不要问我为什么,国内没有哪个DLL库里面有这个DLL文件,当然,最后还是被我找到了。是在知乎上介绍了一个国外的DLL网站

  https://www.dll-files.com/msvcr120d.dll.html 就是这个网站,而且我还帮你找到了,记得谢谢我。

  下载完这两个DLL,然后把它们扔到c\windows\system32中去,然后你就好了。不会遇到ORA-24960这个错误了。

  顺便提下这个错误的原因,是因为你调用的是oraocci12.lib但是你是用的是debug模式。所以你需要将oraocci12.lib改成oracci12d.lib,那么我将这个两个lib都加入呢,呵呵,我告诉你,如果你oraocci12.lib在前面,那么还会遇到这个错误,因为VS调用了这个lib,你添加oracci12d.lib这个文件就好了。

OK,附加上CPP代码

#include <iostream>
#define WIN32COMMON //避免函数重定义错误
#include <occi.h>
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 = "system";
string pass = "Lyw13507991186";
string srvName = "127.0.0.1:1521/orcl";

try
{
//创建数据库连接
Connection *conn = env->createConnection(name, pass, srvName);//用户名,密码,数据库名
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;
}

// 查询数据库时间
std::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);
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 TABLE_TEST_WANG (NAME, NUM, AGE) VALUES ('邓超', '99', '41')");

// 执行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;
}

你就能愉快的玩耍了!

 

 

 

  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM