vc java sdk
由于项目的需要,需要用C++去连Oracle数据库,Oracle版本为10g,在经过n次错误后终于成功连接。 最开始用ADO连,装上客户端以后,在Oracle Net Manager中设置服务命名,测试连接成功,然后设置ODBC数据源,测试也成功,ADO连接串写上"DSN=xxx"就能连上了,但是在释放连接时总是出错,经过多次尝试后放弃,在网上看到Oracle专门为C++提供了连接的接口OCCI,于是尝试采用这种方法。 一、安装Oracle客户端 安装方式选择为管理员。安装完以后设置服务命名。在%ORACLIENTHOME%\NETWORK\ADMIN目录下tnsnames.ora文件记录了服务命名的设置。我的设置如下:
其中192.168.0.3为远程Oracle服务器IP地址设置完以后在Net Manager中测试连接,成功就OK了。 二、设置VC++.net环境 我用的编译器是VS2003,首先在工具---选项中Project添加包含文件%OracleClientHome%\Oci\include添加库文件%OracleClientHome%\Oci\lib\msvc\vc71和%OracleClientHome%\Oci\lib\msvc如果是VC6.0的话就添加%OracleClientHome%\Oci\lib\msvc\vc6。然后设置项目属性,在编译器---链接中添加lib文件,oraocci10d.lib,之后把oraocci10d.dll文件复制到system32目录下,这个文件在VC71目录下。第三步在C++----代码生成中设置运行时库为多线程DLL或是多线程调试DLL,注意这一步设置很重要,没有设置的话会造成getString函数出错。 三、代码
orcl_192.168.0.3就是前面设置的连接串。测试成功。以上就是所有的设置过程,唉,还是jdbc好连阿。。。注意,项目属性中运行时库一定要设置为多线程DLL或是多线程调试DLL,否则getString函数就会出错,我在这个问题上也卡了很长时间,单步调试发现是在string对象析购时出错,在网上看到一篇文章得到答案。 原因是由于程序中使用的内存管理多来源于crt提供的例程,而非直接使用操作系统的接口,这些例程都需要维护一些module全局数据(例如维护池、维护空闲块、或者标记已申请的块等等,不同的实现中有不同的作用),当他们被静态连编时,实际上这些“全局数据”就不“全局”了,不同的module各自为政,每份module都有自己的“全局数据”,自身的内存信息不为他人所知,module A的合法内存快自然不可能通得过module B的合法性验证 解决问题的方法有: 1、不要跨module传递c++对象,或者避免释放跨module申请的内存 2、将参与合作的module统统以multithreaded dll方式链入crt库,让他们的“全局”数据真正全局,注意,所有有交互的module都需要动态链入crt。