前言:
这段时间由于一些特殊的原因,突然想学习一下oracle occi程序的开发。毕竟,大部分公司的业务都是围绕着数据库进行的,而oracle又是数据库中的银河战舰。
oracle基于odbc驱动的的开发已经很成熟,网上也会有很多比较不错的文档。但基于occi开发的文档很少,而且几乎全是英文的,对一些英文不好的同志来说,简直是一种折磨!特别是对于海量数据处理时,occi提供的函数为Oracle数据库的底层函数,在效率方面的优势不言而喻!
我参考着下面的这篇博客http://kb.cnblogs.com/a/2317158/,简单的做了下配置,并记录下配置的过程。以便自己以后查阅,如果能够给别人提供帮助,哪怕是一点点的帮助,我也会觉得很高兴。
第一部分:准备开发环境
1> 安装vs 2008
此部分省略。应该是不会出什么问题的。
2>安装 oracle数据库
由于本人只是为了测试代码的方便,只是在自己的笔记本上安装了一个简化版的数据库,而且是最新版本的!
大概300多M,而且是最新的11g。之所以选择11g是要把握时代脉搏,与时俱进!
当然,下载的过程中甲骨文公司会要求注册,也许有人会觉得麻烦的,但这确实是值得的。
解压之后,安装的过程也不再赘述。现在windows下面的软件安装一般都是非常容易的。如果真的有困难的话,请使用google自行解决。
第二部分:配置开发环境
1,配置vs 2008开发环境!
安装好Oralce之后, 在安装目录(G:\oraclexe\app\oracle\product\11.2.0\server\oci\lib\MSVC\vc9)下,可以看到如下文件:
这就是需要引入的库文件。另外需要引入头文件,本机需要引入的头文件在G:\oraclexe\app\oracle\product\11.2.0\server\oci\include目录下。请读者根据自己的实际情况添加引用头文件。
vs 2008添加库文件和头文件的方法:菜单->工具->选项....。会弹出如下对话框:
左侧树状结构选择"项目和解决方案"节点,然后选择"c++ 目录"节点。右侧有“显示以下内容的目录”的下拉列表框。可将头文件和库文件分别添加到"包含文件"和"库文件"目录下。
2,oracle新建表,以供操作。本人比较懒,就在SYSTEM用户下随便建了一张表。具体Sql如下:
建表成功之后。就可以进行数据库的occi代码测试了。
第三部分:编码,测试!
// OracleTest.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "iostream" #include <occi.h> #pragma comment(lib,"oraocci11.lib") using namespace oracle::occi; using namespace std; int _tmain(int argc, _TCHAR* argv[]) { try { const string userName = "SYSTEM"; const string password = "wxw"; const string connectString= "//localhost:1521/xe"; oracle::occi::Environment *env = oracle::occi::Environment::createEnvironment("ZHS16GBK","UTF8"); //建立连接 Connection *conn = env->createConnection(userName, password, connectString); Statement *stmt = conn->createStatement("select * from userinfo"); ResultSet *rs = stmt->executeQuery(); while (rs->next()) { string l1=rs->getString(1); string l2=rs->getString(2); string l3=rs->getString(3); cout <<"用户ID"<<l1<<" 用户姓名:"<<l2<<" 用户地址:"<<l3<<endl; } stmt->closeResultSet(rs); conn->terminateStatement(stmt); //释放连接 env->terminateConnection(conn); oracle::occi::Environment::terminateEnvironment(env); } catch (SQLException &sqlExcp) { int i=sqlExcp.getErrorCode(); string strinfo=sqlExcp.getMessage(); cout<<strinfo; } int i; cin>>i; return 0; }
注意!如果是按照上面的代码测试,需将vs 2008中dubug改为release模式!
以下为常见错误:来自http://kb.cnblogs.com/a/2317158/
分享一些在开发和测试的过程中,经常会遇见一些常见的问题(win + VC).
编译代码时,发现大量错误,都是说某些CRT函数名称重复.
原因中多半是同一个项目静态链接了两个不同版本的CRT库.比如VC2005的程序A依赖VC2008的程序B(B使用OCCI),B的代码生成方式为/MT或者/MTd.
将上面的场景中,程序B的代码生成方式改成/MD或者/MDd后,编译通过,但是程序运行发生崩溃.
很可能是代码中的某个对象产生和释放分别调用了不同的CRT(一个是VC2005的,一个是VC2008的).解决办法:没有什么好的解决办法,最好还是统一开发环境吧,C++导出的类不适合跨环境.
出现ORA-24960错误
你的项目是debug版本,但链接了release版本的occi库.
出现R6034错误
OCCI库跟你的VC版本不一致.
调试时,发现堆栈被莫名其妙的破坏
同上,或者OCCI的debug与release版本跟当前项目的设置不匹配.
找不到MSVCR90.DLL
记得让你的客户安装VC9的redist.
找不到MSVCR90D.DLL
你发布的程序是调试版本的,虽然你的用户安装了VC9的redist,那也是没用的,因为redist只会安装release版本的运行时库.
如果一切正常,您会看到如下界面:
祝您好运!