因为项目要使用到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两个软件包,对于我来说如下图
下载完数据库之后,将数据库安装好,instant client解压得到以下文件
注意到,这个instant client使用的是VC14。
如果你不想运行的时候把DLL拷贝到VS工作目录中取,那么请设置系统环境变量PATH来引导系统找到这些DLL
之后进入到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