您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 国内外标准规范 > C#应用程序开发免安装Oracle户端的问题
C#应用程序开发(CS)免安装Oracle户端的问题当前,随着数字化和网络化的发展,应用开发程序能够简洁部署已成为重要的应用环节。由于信息化的发展,我公司先后实施了电极箔生产管理系统,电子铝箔生产管理系统,高纯铝生产管理系统,每个生产管理系统都存在着ORACLE客户端的使用安装。维护工作量相当大。如何解决C/S架构下不安装ORACLE客户端是一个非常重要的问题在开发生产管理系统项目中使用.Net链接Oracle数据库,有两个驱动:一个是MicrosoftCorporation公司.Net产品自带的,一个是Oracle公司开发的ODP.Net的驱动。MicrosoftCorporation公司.Net产品自带的驱动,必须用TNS方式连接数据库必须用TNS方式连接数据库,而不能用这种:DataSource=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.34)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORC)));UserID=admin;Password=admin;一、项目研发背景开发Oracle的.Net程序,标准流程是先安装Oracle客户端,然后使用.Net自带驱动或者ODP.Net。其实只要按照这个流程来做,基本上不会有错误,要错也只是TNS错而已。由于Oracle客户端实在是无比庞大,尽管后来可以只安装Oracle客户端运行时,仍然很大。在此方案中,我们希望能做到免安装,伴随着我们开发的主程序拷贝过去就能用。经过多次测试,Oracle客户端运行时的关键在于OCI,也就是说,不管用什么语言写的程序,只要能找到运行时的oci.dll,基本上就能链接Oracle数据库了。综合比较:MicrosoftCorporation公司.Net产品自带的驱动和Oracle公司开发的ODP.Net的驱动比较项目.Net自带Oracle驱动OracleODP.Net驱动连接字符串TNS写法支持支持连接字符串非TNS写法不支持支持是否支持Oracle9运行时支持不支持是否支持Oracle11运行时支持支持OCI目录设置方式环境变量Path中设置环境变量Path中设置其它环境变量需要设置ORACLE_HOME无运行时安装包大小9i运行时安装包13M11g运行时安装包30M最新ODP.Net共52M绿色精简后大小9i运行时6.5M11g运行时30M据说的差别性能底下,功能特性少性能最高,功能特性多二、项目技术方案1、Oracle数据库连接,采用ORACLEODP.NEToci.dll:主要是Client.OracleCommand事件。ociw32.dll:主要是oracle客户端及网络组件。orannzsbb11.dll、oraocci11.dll、oraociei11.dll:Oracle.DataAccess.Client.OracleException异常事务处理Oracle.DataAccess.dll:数据库连接处理。OraOps11w.dll:主要是Client.OracleCommand事件。实际上,这是使用ODP.Net经常遇到的问题,在ODP.Net中,Oracle.DataAccess.dll=OraOps11w.dll=oci.dll,前面两者的版本必须100%匹配。应用程序必须找到上述文件的路径。2、客户端监听处理。oracle.key、classes12.jar、ojdbc14.jarclasses12.jar、ojdbc14.jar必须在注册表里注册文件路径或环境变量。3.配置d:\oracleinstantclient的tnsnames.ora文件,在当前\NETWORK\ADMIN下存放文件tnsnames.ora只需要修改其中的服务器地址、服务名称和端口。tnsnames.ora文件内容orcl=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.4.181)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)))4、注册表加入下面键值变量名:1)ORACLE_HOME变量值:D:\ProgramFiles\instantclient_10_22)变量名:TNS_ADMIN变量值:D:\ProgramFiles\instantclient_10_23)变量名:NLS_LANG变量值:SIMPLIFIEDCHINESE_CHINA.ZHS16GBK4)修改Path变量,在后面添加D:\ProgramFiles\instantclient_10_2三、网络实施的项目技术方案在做过的项目中,经常有连接Oracle数据库的情况,但是由于种种原因,无法在部署程序的电脑上安装Oracle客户端。这里提供了一种简单的,无需安装和多余配置的方法。适用于.NETC#。网上有一些解决办法,通常是要下载对应版本的Oracleinstantclient,但是这个客户端是个压缩包,解压之后,还要进行一些配置。对于客户来说,有时候配置这些也是比较繁琐的,因此这里把相关的内容总结一下,得出一个较为合理的方法。本方法优点:1、程序内集成Oracle客户端,无需用户自行进行配置本方法缺点:2、增加程序包的体积(Oracleinstantclient本身有几十兆大小)下面说一下如何实现。0、首先,从Oracle网站上下载对应版本的Oracleinstantclient包,网址在这里由于是Windows程序,只需要下载Win32或64版本就行了。1、下载来的.zip压缩包,解压后应该有如下文件:(测试是11G版本,10可能略有不同)classes12.jaroci.dllocijdbc11.dllociw32.dllojdbc14.jarOracle.DataAccess.dllorannzsbb11.dlloraocci11.dlloraociei11.dllOraOps11.dll其中Oraociei11.dll体积最大,可能封装了一些资源文件。2、在你的工程根目录下新建一个”Oracle”的文件夹(其实名字和位置随便定),然后将上述文件拷贝到里边,并在VisualStudio中添加这个文件夹及文件们。保证你的解决方案里能看到它们。3、在VisualStudioIDE的“解决方案资源管理器”里,打开Oracle文件夹,选中里边所有的文件,在“属性”“复制到输出目录”里设置“如果较新则复制”,这样在编译或者发布程序的时候,Oracle文件夹会随着发布到exe所在的地方,部署时候就不会出现找不到Oracle库的情况。4、按照网上的大多数教程,这个时候就需要在widnows环境变量里边添加东西了。其实这一步不是必须的,因为考虑到不同的客户环境,有可能用户没有权限在他的计算机上操作这些,那么我们把设置Oracle环境变量放到程序里来做。那么在你初始化程序之后,使用Oracle之前,需要添加如下代码:stringoraclePath=System.Windows.Forms.Application.StartupPath+@\oracle;Environment.SetEnvironmentVariable(PATH,oraclePath,EnvironmentVariableTarget.Process);Environment.SetEnvironmentVariable(NLS_LANG,SIMPLIFIEDCHINESE_CHINA.ZHS16GBK,EnvironmentVariableTarget.Process);解释一下上面的代码:stringoraclePath=System.Windows.Forms.Application.StartupPath+@\oracle;这一句取得了oracle驱动文件夹的位置,也就是放oci.dll的地方。Environment.SetEnvironmentVariable(PATH,oraclePath,EnvironmentVariableTarget.Process);这一句设置环境变量“PATH”,写入oracle驱动所在的文件夹,第三个参数表示这个PATH只在当前进程起作用,不会修改电脑本身。注意:如果你用到某些外部程序,还有其他PATH变量要设置,在这里加入就行了。具体方法参见.net相关文档。Environment.SetEnvironmentVariable(NLS_LANG,SIMPLIFIEDCHINESE_CHINA.ZHS16GBK,EnvironmentVariableTarget.Process);这一句,设置Oracle在通讯过程中使用的语言和字符集。我的项目用的是上面的字符集,对应到你的项目,可用SQL语句去oracle数据库中查询。这个语言和字符集一定要和服务器一致,否则可能会出现乱码甚至无法连接。可能会用到如下SQL语句://selectuserenv('language')fromdual;查询服务端字符集,用来设置上面的参数。//select*fromnls_database_parameters;//服务器字符集//select*fromnls_instance_parameters;//ora文件定义字符集//select*fromnls_session_parameters;//会话字符集5、理论上,经过上面的设置,你的程序就可以使用内置到exe目录下的Oracle驱动了,这里要注意的还有就是连接数据库的方式,上面的修改并不能保证你可以使用tns名来连接,因此连接字符串要做如下修改:在app.config中修改connectionString为PersistSecurityInfo=True;UserID=数据库用户名;Password=数据库密码;Unicode=True;DataSource=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=服务器IP地址)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=服务器上的数据库实例名)));这个主要是把“DataSource”这部分直接用tcp/ip字符串方式替换了(通常DataSource是写tns名称的)6、好了,运行你的程序试试看吧。最后,如果你还是习惯写tns名称来访问oracle数据库,那么还要做以下工作。(注意,以下未测试)a.在程序的Oracle文件夹下增加tnsnames.ora,并将tns名称的配置写到里边去。b.在程序设置环境变量的地方,加入Environment.SetEnvironmentVariable(TNS_ADMIN,oraclePath,EnvironmentVariableTarget.Process);c.连接字符串里应该可以使用tns名称了OracleODP.Net的手工分发1、版本:Version对于ODP.Net版本问题,若使用ODP.Net10.2.0版本,则客户端(OracleClient)也要相应的使用10.2的版本,否则会链接不成功;其实也是很简单,就是保证Bin目录下的dll版本就基本差不多了;同时ODP.Net在此目录增加两个非常重要的dll(OraOps10.dll,OraOps10w.dll);2、语言集:(Nls/Data)基于《Oracle10GClient的手工分发》一文的基础之上增加一个lx20367.nlb这个文件就可;3、注册表:(ODP.Net注册表键值)指出ODP.Netdll的位置(即Bin下的两个特殊文件,见1
本文标题:C#应用程序开发免安装Oracle户端的问题
链接地址:https://www.777doc.com/doc-5077578 .html