AI智能
改变未来

VC++.net使用OCCI连接远程Oracle

用 C++去连 Oracle 数据库,Oracle 版本为 10g,在经过 n 次错误后终于成功连 接。 最开始用 ADO 连,装上客户端以后,在 Oracle Net Manager 中设置服务命名,测试连接成功,然后 设置 ODBC 数据源,测试也成功,ADO 连接串写上”DSN=xxx”就能连上了,但是在 释放连接时总是出错, 经过多次尝试后放弃,在网上看到 Oracle 专门为 C++提供了连接的接口 OCCI, 于是尝试采用这种方法。

安装 Oracle 客户端

安装方式选择为管理员。安装完以后设置服务命名。在%ORACLIENTHOME%\\NETWORK\\ADMIN 目录下 tnsnames.ora 文件记录了服 务命名的设置。我的设置如下:中 华 考 试 网

ORCL_192.168.0.3 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.3)(PORT = 1521)) ) (CONNECT_DATA = (SID = orcl) (SERVER = DEDICATED) ) ) ORCL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.3)(PORT= 1521)) ) (CONNECT_DATA = (SERVICE_NAME = ORCL_192.168.0.3) ) )

其中 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 函数出错。

代码

#include ” stdafx.h ” #include <occi.h> usingnamespacestd; usingnamespace oracle::occi ; int main() { Environment * env = Environment::createEnvironment( ” ZHS16GBK ” , ” UTF8 ” ); //Environment *env=Environment::createEnvironment(Environment::DEFAULT);string mc; { Connection * conn = env ->createConnection( ” system ” , ” system ” , ” orcl_192.168.0.3 ” ); try { Statement * stmt = conn ->createStatement( ” select * from test1 ” ); ResultSet * rs = stmt ->executeQuery(); while (rs -> next() == true ) { mc= rs ->getString( 1 ); cout<< mc <<endl; }

stmt ->closeResultSet(rs); conn ->terminateStatement(stmt); } catch (SQLException e) { cout<<e.what(); } env ->terminateConnection(conn); } Environment::terminateEnvironment(env); system( ” pause ” ); return 0 ; }

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。

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » VC++.net使用OCCI连接远程Oracle