VC net使用OCCI连接远程Oracle数据库
vc环境下C连接oracle

概述在visual c++下开发oracle库接口主要有两种方法。
一种方法是利用visual c++提供的多种数据库访问技术,如开放数据库连接odbc、数据存取对象dao、对象连接和嵌入数据库ole db和activex数据对象ado等。
另一种方法是在visual c++中嵌入sql语句,这就是所指的pro*c/c++(本文简称proc)。
前一种方法由于有mfc 强大的类库支持,熟悉vc编程时则实现方便,且可移植性强;但是,与proc 相比,应用程序需要经过两层才能和数据库通信接口建立联系,编程相对复杂,执行效率相对较低。
proc支持嵌入式pl/sql 块等直接调用oracle 库,将过程化语言和非过程化语言相结合,形成一种更强的开发工具,可开发出满足各种复杂要求的优化应用程序,执行效率高。
适合熟悉oracle技术的人员应用。
但是用proc 开发出的应用程序无法向异构数据库平台移植。
-fXqmfL [转贴于我的学习网IT认证ORACLE/CIW认证)-fXqmfL本文详细描述实际利用proc在visual c++环境下开发oracle数据库接口程序的方法和具体操作步骤,并给出了编程实例。
叙述以visual c++ 6.0版和oracle8i版为例,其他版本可根据实际情况变更。
几个特殊文件proc在vc下开发oracle库接口时,需要用到几个特殊文件。
1、proc的可执行文件procui. exe用oracle_home代表oracle安装后的根目录,当其以缺省方式安装在计算机的d盘时,则oracle_home位置是d: \ oracle。
这时proc的可执行文件在oracle_home \ ora81 \ bin \ procui. exe,对缺省安装即在d: \ oracle \ ora81 \ bin \ procui. exe。
2、oracle支持sql在vc环境的库文件orasql8. lib根据以上约定,orasql8. lib文件在oracle_home \ ora81 \ precomp \ lib \ msvc \ orasql8.lib,对缺省安装即在d: \ oracle \ ora81 \ precomp \ lib \ msvc \ orasql8.lib。
如何连接别人的ORACLE数据库

如何连接别人电脑上的ORACLE数据库(以oracle9i版本为例,本机必须安装oralce9i的客户端)
第一步:orahome92-configuration and migration tools- net managers
第二步:在“服务命名”中点“+”
第三步:编辑一个你的服务名,(不是对方的数据库名)
第四步:默认选择TCP/IP
第五步:主机名填入对方的机器IP地址,端口默认(不要改)
第六步:服务名是对方的数据库名(要问对方),连接类型默认(不要改)
第七步:连接测试
一般测试结果需要“更改登录”
更改登录中,在用户名和口令中,录入对方数据库的用户名口令(你要访问的库)
测试成功!点击“关闭”
点“完成”
第八步:保存网络配置
在“E:\oracle\ora92\network\admin”中打开tnsnames.ora,可以看到配置情况:MORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.34)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
第九步:到此,可以检查配置是否正确,是否连接成功
运行—输入sqlplus,在“请输入用户名”中键入数据库连接方式
第十步:连接成功,可以通过PLSQL等客户端工具连接别人的数据库了!。
VS2013位使用64位ocilib进行64位oracle11g连接配置教程

VS2013位使用64位ocilib进行64位oracle11g连接配置
教程
本机环境,windows 7 sp1 旗舰版64位。
Oracle 11g client 64位。
Visual studio 2013-ultimate-u5
Oci-3.12.1解压在d盘根目录下。
在vs2013中新建项目。
右键你的项目-属性-VC++目录-包含目录,编辑选择ocilib的include目录
右键你的项目-属性-C/C++-常规-附加包含目录,编辑选择ocilib 的include目录
右键你的项目-属性-链接库-常规-附加库目录,编辑选择ocilib的lib64目录
右键你的项目-属性-链接库-输入-附加依赖项,输入你要使用的lib库。
对于dll文件,放在项目对应debug文件夹下。
Vs2013编译
选择生成-配置管理器
新建x64平台,选择x64平台。
然后再生成解决方案,在运行,ok。
之前遇到无法加载oci.dll的问题,是因为,我系统装的oracle client是64位的,所以其bin 目录下的oci.dll也是64位的,导致在用32位编译的时候,调用不了64位的dll文件。
将所有的都改成64位统一后,就能使用ocilib连接oracle进行操作了。
操作的代码略,可以百度ocilib连接oracle的例子,本文只提供配置方法。
C++ 使用OCILIB 连接Oracle数据库 总结

====== 参考文献 ====== -/blog/1059676 -/p/ocilib/ -/jackyxinli/archive/2009/07/30/91711.html -ocilib 中的文档
using namespace std;
// 用来提示错误的句柄 void err_handler(OCI_Error *err) {
printf( "code : ORA-%05i\n" "msg : %s\n" "sql : %s\n", OCI_ErrorGetOCICode(err), OCI_ErrorGetString(err), OCI_GetSql(OCI_ErrorGetStatement(err))
printf("证券代码: %i, 日期: %i \n", OCI_GetInt(rs,1), OCI_GetInt(rs,2)); }
OCI_StatementFree(st); OCI_ConnectionFree(cn); }else{ cout << "数据库连接失败" << endl; } OCI_Cleanup();
); }
int main(){ OCI_Connection *cn;
[C++]通过OCCI操作Oracle数据库详解
![[C++]通过OCCI操作Oracle数据库详解](https://img.taocdn.com/s3/m/708d2c27f011f18583d049649b6648d7c1c70815.png)
[C++]通过OCCI操作Oracle数据库详解 今⽇趁空,尝试⽤C++操作Oracle数据库。
⼤致步骤列举如下:1.安装OCCIoracle-instantclient-sqlplus-10.2.0.5-1.i386.rpmoracle-instantclient-devel-10.2.0.5-1.i386.rpmoracle-instantclient-odbc-10.2.0.5-1.i386.rpmoracle-instantclient-basic-10.2.0.5-1.i386.rpm安装完成之后,会在/usr/lib下多个oracle 共享库⽂件夹,在/usr/include下多个oracle 头⽂件(接⼝)⽂件夹(可以将他们放到环境变量中)。
我的数据库版本是10.2.0,下⾯以此为例。
2.编写HelloWorld程序测试连接#include <iostream>#define LINUXOCCI //避免函数重定义错误#include <occi.h>using namespace std;using namespace oracle::occi;int main(){Environment *env=Environment::createEnvironment(Environment::DEFAULT);cout<<"success"<<endl;string name = "scott";string pass = "tiger";string srvName = "127.0.0.1:1522/orcl";try{Connection *conn = env->createConnection(name, pass);cout<<"conn success"<<endl;env->terminateConnection(conn);}catch(SQLException e){cout<<e.what()<<endl;return -1;}Environment::terminateEnvironment(env);cout<<"end!"<<endl;return0;}编译命令:g++ -o test -I/usr/include/oracle/10.2.0.5/client -L/usr/lib/oracle/10.2.0.5/client/lib -locci -lsqlplus我没有将occi的路径加⼊到环境变量中,所以此处要显⽰列出⽬录才能通过编译,找到共享库。
Oracle数据库远程连接设置的四种方法

Oracle数据库远程连接设置的四种方法Oracle数据库的远程连接可以通过多种方式来实现,本文我们主要介绍四种远程连接的方法和注意事项,并通过示例来说明,接下来我们就开始介绍。
第一种情况:若oracle服务器装在本机上,那就不多说了,连接只是用户名和密码的问题了。
不过要注意环境变量%ORACLE_HOME%/network/admin/是否设置。
第二种情况:本机未安装oracle服务器,也未安装oracle客户端。
但是安装了pl sql development、toad sqldevelopment、sql navigator等管理数据库的工具。
在虚拟机或者另一台电脑上安装了oracle服务器,也就是虚拟机或者另一台电脑此时作为服务器。
这种情况下,本人以pl sql development远程连接ORACLE服务端数据库为例:1、在安装oracle服务器的机器上搜索下列文件:∙oci.dll∙ocijdbc10.dll∙ociw32.dll∙orannzsbb10.dll∙oraocci10.dll∙oraociei10.dll∙sqlnet.ora∙tnsnames.ora∙classes12.jar∙ojdbc14.jar把这些找到的文件复制放到一个文件夹,如 oraclient,将此文件夹复制到客户端机器上。
如放置路径为D:oraclient。
2、配置tnsnames.ora,修改其中的数据库连接串。
1.oracledata =2.3.(DESCRIPTION =4.5.(ADDRESS_LIST =6.7.(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.58)(PORT = 1521))8.9.(CONNECT_DATA =10.11.(SERVICE_NAME = oracledata)12.13.)其中,oracledata是要连接的服务名;HOST = 192.168.0.58,是服务器IP地址;PORT = 1521是端口号。
怎么使用OCCI编程-

怎么使用OCCI编程?Oracle给各种编程语言都提供了编程接口,其中C++++的编程模块就是OCCI,通过OCCI我们可以很方便的访问数据的信息,读取数据库的属性,下面我们看看怎么使用OCCI编程。
本文使用Centos 7.0为例,Oracle的版本是12.2一,环境准备1.1 默认的Oracle安装中没有提供OCCI接口的包,需要我们在Oracle官网下载,地址是:https://oracle/technetwork/topics/linuxsoft-082809l需要安装下面几个内容:oracle-instantclient12.2-devel-12.2.0.1.0-1.i386.rpm (606,868 bytes) (cksum - 1259587459) oracle-instantclient12.2-basic-12.2.0.1.0-1.i386.rpm (49,071,616 bytes) (cksum - 2998080493) oracle-instantclient12.2-odbc-12.2.0.1.0-2.i386.rpm (223,276 bytes) (cksum - 1211395846) oracle-instantclient18.3-sqlplus-18.3.0.0.0-1.i386.rpm (689,504 bytes) (cksum - 3705787612)直接运行#rpm –i 包名.rpm 安装即可。
1.2 安装完成后需要设置环境变量,在~/.bashrc中或者/etc/profile中添加下面的命令设置环境变量。
exportORACLE_HOME=/usr/lib/oracle/12.2/client64exportTNS_ADMIN=${ORACLE_HOME}/network/adminexportNLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8# simplifiedchinese_china.UTF8exportLD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${ORACLE_HOME}/lib exportPATH=${ORACLE_HOME}/bin:$PATHexportHISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "添加完成后记得source~/.bashrc 或者source /etc/profile,使得环境变量立即生效。
远程访问Oracle数据库

远程访问oracle数据库
1.开启双方的所有的Oracle的服务。
2.打开Net Configuration Assistant 配置监听器
选择“本地NET服务名配置”→然后下一步→添加
选择添加,然后“下一步”
选择Oracle8i火更高版本数据库或服务,然后“下一步”
服务器为你要连接的远程的数据库名称,一定要数据库名称相同,然后“下一步”
选择“tcp”协议,然后下一步
主机名为你要连接的机子IP(固定IP和局域网IP),然后选择“使用标准端口号1521”→然后“下一步”
选择“是,进行测试”→然后“下一步”
选择“更改登录”
然后输入要连接Oracle数据库的用户名和密码。
才显示测试成功。
然后“下一步”
Net服务名为venice和要连接的数据库的名称相同。
然后“下一步”
选择“否”,然后“下一步”
配置完成,然后“下一步”
直接点击“完成”
3.查看是否监听器正在监听远程数据库。
打开。
选择“本地”→监听程序→“listener”→数据库服务现在一切都OK了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本文由aduanyue贡献
doc文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
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。