《C#应用程序开发免安装Oracle户端的问题ppt课件.ppt》由会员分享,可在线阅读,更多相关《C#应用程序开发免安装Oracle户端的问题ppt课件.ppt(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C#C#应用程序开发应用程序开发(CS) (CS) 免安装免安装OracleOracle户端的问题户端的问题 当前,随着数字化和当前,随着数字化和网络网络化的发展,应用开发程序能够简洁部署已化的发展,应用开发程序能够简洁部署已成为重要的应用环节。由于信息化的发展,我公司先后实施了电极箔生产成为重要的应用环节。由于信息化的发展,我公司先后实施了电极箔生产管理系统,电子铝箔生产管理系统,高纯铝生产管理系统,每个生产管理管理系统,电子铝箔生产管理系统,高纯铝生产管理系统,每个生产管理系统都存在着系统都存在着ORACLEORACLE客户端的使用安装。维护工作量相当大。如何解决客户端的使用安装。维护工作
2、量相当大。如何解决C/SC/S架构下不安装架构下不安装ORACLEORACLE客户端是一个非常重要的问题客户端是一个非常重要的问题 在开发生产管理系统项目中使用在开发生产管理系统项目中使用.Net.Net链接链接OracleOracle数据库,有两个驱动:数据库,有两个驱动:一个是一个是Microsoft CorporationMicrosoft Corporation公司公司.Net.Net产品自带的,一个是产品自带的,一个是OracleOracle公司开公司开发的发的ODP.NetODP.Net的驱动。的驱动。Microsoft CorporationMicrosoft Corporati
3、on公司公司.Net.Net产品自带的驱动,产品自带的驱动,必须用必须用TNSTNS方式连接数据库必须用方式连接数据库必须用TNSTNS方式连接数据库,而不能用这种:方式连接数据库,而不能用这种:Data Source=(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = Data Source=(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.34)(PORT = 1521)(CONNECT_DATA =(SERVER = 192.168.1.34)(PORT = 1521)(CO
4、NNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = ORC);User ID=admin;Password=admin;DEDICATED)(SERVICE_NAME = ORC);User ID=admin;Password=admin;一一 、项目研发背景、项目研发背景 开发开发OracleOracle的的.Net.Net程序,标准流程是先安装程序,标准流程是先安装OracleOracle客户端,然后使客户端,然后使用用.Net.Net自带驱动或者自带驱动或者ODP.NetODP.Net。其实只要按照这个流程来做,基本上不会有错。其实只要按照这个
5、流程来做,基本上不会有错误,要错也只是误,要错也只是TNSTNS错而已。由于错而已。由于OracleOracle客户端实在是无比庞大,尽管后来可客户端实在是无比庞大,尽管后来可以只安装以只安装OracleOracle客户端运行时,仍然很大。客户端运行时,仍然很大。 在此方案中,我们希望能做到免安装,伴随着我们开发的主程序拷贝过在此方案中,我们希望能做到免安装,伴随着我们开发的主程序拷贝过去就能用。经过多次测试,去就能用。经过多次测试,OracleOracle客户端运行时的关键在于客户端运行时的关键在于OCIOCI,也就是说,也就是说,不管用什么语言写的程序,只要能找到运行时的不管用什么语言写的
6、程序,只要能找到运行时的oci.dlloci.dll,基本上就能链接,基本上就能链接OracleOracle数据库了。数据库了。综合比较:综合比较:Microsoft CorporationMicrosoft Corporation公司公司.Net.Net产品自带的驱动和产品自带的驱动和OracleOracle公司开发的公司开发的ODP.NetODP.Net的驱动的驱动比较项目比较项目.Net.Net自带自带OracleOracle驱动驱动Oracle ODP.NetOracle ODP.Net驱动驱动连接字符串连接字符串TNSTNS写法写法支持支持支持支持连接字符串非连接字符串非TNSTNS
7、写法写法不支持不支持支持支持是否支持是否支持Oracle9Oracle9运行时运行时支持支持不支持不支持是否支持是否支持Oracle11Oracle11运行时运行时支持支持支持支持OCIOCI目录设置方式目录设置方式环境变量环境变量PathPath中设置中设置环境变量环境变量PathPath中设置中设置其它环境变量其它环境变量需要设置需要设置ORACLE_HOME ORACLE_HOME 无无运行时安装包大小运行时安装包大小9i9i运行时安装包运行时安装包13M13M11g11g运行时安装包运行时安装包30M30M最新最新ODP.NetODP.Net共共52M52M绿色精简后大小绿色精简后大小
8、9i9i运行时运行时6.5M6.5M11g11g运行时运行时30M30M据说的差别据说的差别性能底下,功能特性少性能底下,功能特性少性能最高,功能特性多性能最高,功能特性多二、项目技术方案二、项目技术方案 1 1、OracleOracle数据库连接,采用数据库连接,采用ORACLE ODP.NETORACLE ODP.NEToci.dll: oci.dll: 主要是主要是Client.OracleCommandClient.OracleCommand事件。事件。ociw32.dllociw32.dll:主要是:主要是oracleoracle客户端及网络组件。客户端及网络组件。orannzsbb
9、11.dllorannzsbb11.dll、oraocci11.dlloraocci11.dll、oraociei11.dll:Oracle.DataAccess.Client.OracleExceptionoraociei11.dll:Oracle.DataAccess.Client.OracleException异常事异常事务处理务处理Oracle.DataAccess.dll:Oracle.DataAccess.dll:数据库连接处理。数据库连接处理。OraOps11w.dll: OraOps11w.dll: 主要是主要是Client.OracleCommandClient.Oracle
10、Command事件。事件。实际上,这是使用实际上,这是使用ODP.NetODP.Net经常遇到的问题,在经常遇到的问题,在ODP.NetODP.Net中,中,Oracle.DataAccess.dll=OraOps11w.dll=oci.dllOracle.DataAccess.dll=OraOps11w.dll=oci.dll,前面两者的版本必,前面两者的版本必须须100%100%匹配。匹配。应用程序必须找到上述文件的路径。应用程序必须找到上述文件的路径。2 2、客户端监听处理。、客户端监听处理。oracle.keyoracle.key、classes12.jarclasses12.jar、
11、ojdbc14.jarojdbc14.jarclasses12.jarclasses12.jar、ojdbc14.jarojdbc14.jar必须在注册表里注册文件路径或必须在注册表里注册文件路径或环境变量。环境变量。3.3.配置配置d:oracleinstantclientd:oracleinstantclient的的tnsnames.oratnsnames.ora文件,在当前文件,在当前NETWORKADMINNETWORKADMIN下存放文件下存放文件tnsnames.oratnsnames.ora只需要修改其中的服务只需要修改其中的服务器地址、服务名称和端口。器地址、服务名称和端口。
12、tnsnames.oratnsnames.ora文件内容文件内容orcl =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL orcl =(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.4.181)(PORT = 1521)(CONNECT_DATA = TCP)(HOST = 172.16.4.181)(PORT = 1521)(CONNECT_DATA =(SERVICE_NAME = orcl)=(SERVICE_NAME = orcl)4 4、
13、注册表加入下面键值、注册表加入下面键值 变量名:变量名: 1) ORACLE_HOME 1) ORACLE_HOME 变量值:变量值:D:Program Filesinstantclient_10_2D:Program Filesinstantclient_10_2 2) 2) 变量名:变量名:TNS_ADMINTNS_ADMIN 变量值:变量值:D:Program Filesinstantclient_10_2D:Program Filesinstantclient_10_2 3) 3) 变量名:变量名:NLS_LANGNLS_LANG 变量值:变量值:SIMPLIFIED CHINESE_
14、CHINA.ZHS16GBKSIMPLIFIED CHINESE_CHINA.ZHS16GBK 4) 4) 修改修改PathPath变量,在后面添加变量,在后面添加 D:Program D:Program Filesinstantclient_10_2Filesinstantclient_10_2三、网络实施的项目技术方案三、网络实施的项目技术方案 在做过的项目中,经常有连接在做过的项目中,经常有连接OracleOracle数据库的情况,但是由于种种原因数据库的情况,但是由于种种原因,无法在部署程序的电脑上安装,无法在部署程序的电脑上安装OracleOracle客户端。这里提供了一种简单的,客
15、户端。这里提供了一种简单的,无需安装和多余配置的方法。适用于无需安装和多余配置的方法。适用于.NET C#.NET C#。 网上有一些解决办法,通常是要下载对应版本的网上有一些解决办法,通常是要下载对应版本的Oracle instant Oracle instant clientclient, 但是这个客户端是个压缩包,解压之后,还要进行一些配置。但是这个客户端是个压缩包,解压之后,还要进行一些配置。对于客户来说,有时候配置这些也是比较繁琐的,因此这里把相关的内容对于客户来说,有时候配置这些也是比较繁琐的,因此这里把相关的内容总结一下,得出一个较为合理的方法。总结一下,得出一个较为合理的方法。
16、本方法优点:本方法优点:1 1、程序内集成、程序内集成OracleOracle客户端,无需用户自行进行配置客户端,无需用户自行进行配置本方法缺点:本方法缺点:2 2、增加程序包的体积(、增加程序包的体积(Oracle instant clientOracle instant client本身有几十兆大小)本身有几十兆大小)下面说一下如何实现。下面说一下如何实现。0 0、首先,从、首先,从OracleOracle网站上下载对应版本的网站上下载对应版本的Oracle instant clientOracle instant client包,网址在这里包,网址在这里http:/ 1 1、下载来的、下
17、载来的.zip.zip压缩包,解压后应该有如下文件:(测试是压缩包,解压后应该有如下文件:(测试是11G11G版本,版本,1010可能略有不同)可能略有不同)classes12.jarclasses12.jaroci.dlloci.dllocijdbc11.dllocijdbc11.dllociw32.dllociw32.dllojdbc14.jarojdbc14.jarOracle.DataAccess.dllOracle.DataAccess.dllorannzsbb11.dllorannzsbb11.dlloraocci11.dlloraocci11.dlloraociei11.dllo
18、raociei11.dllOraOps11.dllOraOps11.dll其中其中Oraociei11.dllOraociei11.dll体积最大,可能封装了一些资源文件。体积最大,可能封装了一些资源文件。2 2、在你的工程根目录下新建一个、在你的工程根目录下新建一个”Oracle”Oracle”的文件夹(其实名字和位置随便定),然的文件夹(其实名字和位置随便定),然后将上述文件拷贝到里边,并在后将上述文件拷贝到里边,并在Visual StudioVisual Studio中添加这个文件夹及文件们。保证你的中添加这个文件夹及文件们。保证你的解决方案里能看到它们。解决方案里能看到它们。3 3、在
19、、在Visual Studio IDEVisual Studio IDE的的“解决方案资源管理器解决方案资源管理器”里,打开里,打开OracleOracle文件夹,选中里文件夹,选中里边所有的文件,在边所有的文件,在“属性属性”“”“复制到输出目录复制到输出目录”里设置里设置“如果较新则复制如果较新则复制”,这样在,这样在编译或者发布程序的时候,编译或者发布程序的时候,OracleOracle文件夹会随着发布到文件夹会随着发布到exeexe所在的地方,部署时候就不所在的地方,部署时候就不会出现找不到会出现找不到OracleOracle库的情况。库的情况。4 4、按照网上的大多数教程,这个时候就
20、需要在、按照网上的大多数教程,这个时候就需要在widnowswidnows环境变量里边添加东西了。其环境变量里边添加东西了。其实这一步不是必须的,因为考虑到不同的客户环境,有可能用户没有权限在他的计算实这一步不是必须的,因为考虑到不同的客户环境,有可能用户没有权限在他的计算机上操作这些,那么我们把设置机上操作这些,那么我们把设置OracleOracle环境变量放到程序里来做。那么在你初始化程环境变量放到程序里来做。那么在你初始化程序之后,使用序之后,使用OracleOracle之前,需要添加如下代码:之前,需要添加如下代码: string oraclePath = System.Windows
21、.Forms.Application.StartupPath + string oraclePath = System.Windows.Forms.Application.StartupPath + oracle;oracle;Environment.SetEnvironmentVariable(PATH, Environment.SetEnvironmentVariable(PATH, oraclePath,EnvironmentVariableTarget.Process);oraclePath,EnvironmentVariableTarget.Process);Environment.
22、SetEnvironmentVariable(NLS_LANG, SIMPLIFIED Environment.SetEnvironmentVariable(NLS_LANG, SIMPLIFIED CHINESE_CHINA.ZHS16GBK, EnvironmentVariableTarget.Process);CHINESE_CHINA.ZHS16GBK, EnvironmentVariableTarget.Process);解释一下上面的代码:解释一下上面的代码:string oraclePath = System.Windows.Forms.Application.StartupPa
23、th + oracle;string oraclePath = System.Windows.Forms.Application.StartupPath + oracle;这一句取得了这一句取得了oracle oracle 驱动文件夹的位置,也就是放驱动文件夹的位置,也就是放oci.dlloci.dll的地方。的地方。Environment.SetEnvironmentVariable(PATH, Environment.SetEnvironmentVariable(PATH, oraclePath,EnvironmentVariableTarget.Process);oraclePath,E
24、nvironmentVariableTarget.Process);这一句设置环境变量这一句设置环境变量“PATHPATH”,写入,写入oracleoracle驱动所在的文件夹,第三个参数表示这个驱动所在的文件夹,第三个参数表示这个PATHPATH只在当前进程起作用,不会修改电脑本身。只在当前进程起作用,不会修改电脑本身。注意:如果你用到某些外部程序,还有其他注意:如果你用到某些外部程序,还有其他PATHPATH变量要设置,在这里加入就行了。具体方变量要设置,在这里加入就行了。具体方法参见法参见相关文档。相关文档。Environment.SetEnvironmentVariable(NLS_L
25、ANG, SIMPLIFIED Environment.SetEnvironmentVariable(NLS_LANG, SIMPLIFIED CHINESE_CHINA.ZHS16GBK, EnvironmentVariableTarget.Process);CHINESE_CHINA.ZHS16GBK, EnvironmentVariableTarget.Process);这一句,设置这一句,设置OracleOracle在通讯过程中使用的语言和字符集。我的项目用的是上面的字符集,在通讯过程中使用的语言和字符集。我的项目用的是上面的字符集,对应到你的项目,可用对应到你的项目,可用SQLSQL
26、语句去语句去oracleoracle数据库中查询。这个语言和字符集一定要和服务数据库中查询。这个语言和字符集一定要和服务器一致,否则可能会出现乱码甚至无法连接。可能会用到如下器一致,否则可能会出现乱码甚至无法连接。可能会用到如下SQLSQL语句:语句:/select userenv(language) from dual; /select userenv(language) from dual; 查询服务端字符集查询服务端字符集, ,用来设置上面的参数。用来设置上面的参数。/select /select * * from nls_database_parameters;/ from nls_d
27、atabase_parameters;/服务器字符集服务器字符集/select /select * * from nls_instance_parameters;/ora from nls_instance_parameters;/ora文件定义字符集文件定义字符集/select /select * * from nls_session_parameters; / from nls_session_parameters; /会话字符集会话字符集5 5、理论上,经过上面的设置,你的程序就可以使用内置到、理论上,经过上面的设置,你的程序就可以使用内置到exeexe目录下的目录下的OracleOra
28、cle驱动了,这驱动了,这里要注意的还有就是连接数据库的方式,上面的修改并不能保证你可以使用里要注意的还有就是连接数据库的方式,上面的修改并不能保证你可以使用tnstns名来连接,名来连接,因此连接字符串要做如下修改:因此连接字符串要做如下修改: 在在app.configapp.config中修改中修改connectionStringconnectionString为为Persist Security Info=True;User ID=Persist Security Info=True;User ID=数据库用户名数据库用户名;Password=;Password=数据库密数据库密码码;U
29、nicode=True;Data Source= (DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL ;Unicode=True;Data Source= (DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = = TCP)(HOST = 服务器服务器IPIP地址地址)(PORT = 1521)(CONNECT_DATA =(SERVICE_NAME = )(PORT = 1521)(CONNECT_DATA =(SERVICE_NAME = 服务服务器上的数据库实例名器上的
30、数据库实例名););这个主要是把这个主要是把“Data Source”Data Source”这部分直接用这部分直接用tcp/iptcp/ip字符串方式替换了(通常字符串方式替换了(通常Data SourceData Source是写是写tnstns名称的)名称的)6 6、好了,运行你的程序试试看吧。、好了,运行你的程序试试看吧。最后最后,如果你还是习惯写,如果你还是习惯写tnstns名称来访问名称来访问oracleoracle数据库,那么还要做以下工作。数据库,那么还要做以下工作。(注意,以下未测试)(注意,以下未测试)a.a.在程序的在程序的OracleOracle文件夹下增加文件夹下增加
31、tnsnames.oratnsnames.ora,并将,并将tnstns名称的配置写到里边去。名称的配置写到里边去。b.b.在程序设置环境变量的地方,加入在程序设置环境变量的地方,加入Environment.SetEnvironmentVariable(TNS_ADMIN, Environment.SetEnvironmentVariable(TNS_ADMIN, oraclePath,EnvironmentVariableTarget.Process);oraclePath,EnvironmentVariableTarget.Process);c.c.连接字符串里应该可以使用连接字符串里应该
32、可以使用tnstns名称了名称了Oracle ODP.Net Oracle ODP.Net 的手工分发的手工分发 1 1 、版本:、版本:VersionVersion 对于对于ODP.NetODP.Net版本问题,若使用版本问题,若使用ODP.Net10.2.0ODP.Net10.2.0版本,则客户端版本,则客户端(Oracle (Oracle Client)Client)也要相应的使用也要相应的使用10.210.2的版本,否则会链接不成功;其实也是很简单,的版本,否则会链接不成功;其实也是很简单,就是保证就是保证BinBin目录下的目录下的dlldll版本就基本差不多了;同时版本就基本差不多
33、了;同时ODP.NetODP.Net在此目录增加两在此目录增加两个非常重要的个非常重要的dlldll(OraOps10.dllOraOps10.dll,OraOps10w.dllOraOps10w.dll););2 2、语言集:(、语言集:(Nls/DataNls/Data) 基于基于Oracle10G ClientOracle10G Client的手工分发的手工分发一文的基础之上增加一个一文的基础之上增加一个lx20367.nlblx20367.nlb这个文件就可;这个文件就可;3 3、注册表:、注册表:(ODP.Net(ODP.Net注册表键值注册表键值) ) 指出指出ODP.Net dl
34、lODP.Net dll的位置(即的位置(即BinBin下的两个特殊文件,见下的两个特殊文件,见1 1),而不是),而不是Oracle.DataAccess.dllOracle.DataAccess.dll的位置:的位置: 对于对于ODP.Net 10.2ODP.Net 10.2来说注册表如下:来说注册表如下: Windows Registry Editor Version 5.00 Windows Registry Editor Version 5.00 HKEY_LOCAL_MACHINESOFTWAREORACLEODP.NET1.102.2.20 HKEY_LOCAL_MACHINES
35、OFTWAREORACLEODP.NET1.102.2.20 DllPath=C:oracleproduct10.2.0client_1bin DllPath=C:oracleproduct10.2.0client_1bin HKEY_LOCAL_MACHINESOFTWAREORACLEODP.NET2.102.2.20 HKEY_LOCAL_MACHINESOFTWAREORACLEODP.NET2.102.2.20 DllPath=C:oracleproduct10.2.0client_1bin DllPath=C:oracleproduct10.2.0client_1bin四、四、C#C#应用程序部署应用程序部署 综合上述,首先要确定综合上述,首先要确定OracleOracle数据库连接,重点是:应用程序必须找数据库连接,重点是:应用程序必须找到上述文件的路径。其次解决客户端监听处理,重点是:在注册表里注册到上述文件的路径。其次解决客户端监听处理,重点是:在注册表里注册文件路径或环境变量。文件路径或环境变量。通过以上两个技术实施方案,可以解决通过以上两个技术实施方案,可以解决C# OracleC# Oracle免客户端开发问题。免客户端开发问题。
限制150内