一.版本问题
结合这篇博文自己重新做了个总结
visual studio 2017使用OCCI连接oracle数据库全过程解析
https://www.cnblogs.com/steval/articles/6831454.html
首先,连接oracle数据库有四种方法,OLD,ODBC,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下面的,要不然在后面测试的时候就会出现这个问题
(3)因为有三个版本的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
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;
}
连接成功!!