C#应用程序开发免安装Oracle户端的问题课件_第1页
C#应用程序开发免安装Oracle户端的问题课件_第2页
C#应用程序开发免安装Oracle户端的问题课件_第3页
C#应用程序开发免安装Oracle户端的问题课件_第4页
C#应用程序开发免安装Oracle户端的问题课件_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C#应用程序开发(CS)免安装Oracle户端的问题C#应用程序开发(CS)

当前,随着数字化和网络化的发展,应用开发程序能够简洁部署已成为重要的应用环节。由于信息化的发展,我公司先后实施了电极箔生产管理系统,电子铝箔生产管理系统,高纯铝生产管理系统,每个生产管理系统都存在着ORACLE客户端的使用安装。维护工作量相当大。如何解决C/S架构下不安装ORACLE客户端是一个非常重要的问题

在开发生产管理系统项目中使用.Net链接Oracle数据库,有两个驱动:一个是MicrosoftCorporation公司.Net产品自带的,一个是Oracle公司开发的ODP.Net的驱动。MicrosoftCorporation公司.Net产品自带的驱动,必须用TNS方式连接数据库必须用TNS方式连接数据库,而不能用这种:DataSource=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=4)(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数据库了。开发Oracle的.Net程序,标准流程是先安装Or综合比较: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据说的差别性能底下,功能特性少性能最高,功能特性多二、项目技术方案

综合比较:MicrosoftCorporation公司.N1、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%匹配。应用程序必须找到上述文件的路径。1、Oracle数据库连接,采用ORACLEODP.NET2、客户端监听处理。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=81)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=orcl)))2、客户端监听处理。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_24、注册表加入下面键值三、网络实施的项目技术方案

在做过的项目中,经常有连接Oracle数据库的情况,但是由于种种原因,无法在部署程序的电脑上安装Oracle客户端。这里提供了一种简单的,无需安装和多余配置的方法。适用于.NETC#。

网上有一些解决办法,通常是要下载对应版本的Oracleinstantclient,但是这个客户端是个压缩包,解压之后,还要进行一些配置。

对于客户来说,有时候配置这些也是比较繁琐的,因此这里把相关的内容总结一下,得出一个较为合理的方法。三、网络实施的项目技术方案在做过的项目中,经常有连接本方法优点:

1、程序内集成Oracle客户端,无需用户自行进行配置本方法缺点:

2、增加程序包的体积(Oracleinstantclient本身有几十兆大小)下面说一下如何实现。0、首先,从Oracle网站上下载对应版本的Oracleinstantclient包,网址在这里

/technetwork/database/features/instant-client/index-097480.html

由于是Windows程序,只需要下载Win32或64版本就行了。1、下载来的.zip压缩包,解压后应该有如下文件:(测试是11G版本,10可能略有不同)

classes12.jar

oci.dll

ocijdbc11.dll

ociw32.dll

ojdbc14.jar

Oracle.DataAccess.dll

orannzsbb11.dll

oraocci11.dll

oraociei11.dll

OraOps11.dll

其中Oraociei11.dll体积最大,可能封装了一些资源文件。本方法优点:

1、程序内集成Oracle客户端,无需用户自行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);2、在你的工程根目录下新建一个”Oracle”的文件夹(其实解释一下上面的代码:

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;//会话字符集解释一下上面的代码:

stringoraclePath=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名称了5、理论上,经过上面的设置,你的程序就可以使用内置到exe目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)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论