下面是内存溢出 jb51.cc 通过网络收集整理的代码片段。
内存溢出小编现在分享给大家,也给大家做个参考。
我只是一名普通的.Net开发人员,常用sqlServer,偶尔用其它数据库,属于能连上然后select/execute就行的那种。但就是我这么小的愿望,在面对Oracle时都很难实现。 虽然04年就开始用Oracle开发项目,但每次遇到问题总是胡乱弄一下,能用就行。这次又遇到问题,更离谱的是:同一个版本的Newlife.XCode,同一台机器,同一个ODP.Net版本,上个月写的程序工作好好的,怎么折腾都能用,刚刚新写的一个,怎么写都不行!于是,决心彻底的解决这个问题,共耗时三天三夜(熬夜到凌晨一两点)。 我们知道,用.Net链接Oracle数据库,有两个驱动,一个是.Net自带的,一个是Oracle开发的ODP.Net(下载地址)(要注册,后面提供一个我们团队的下载地址)。而.Net自带那个,MS早就不支持不更新了,于是一般开发都会用ODP.Net。并且,.Net自带的驱动,必须用TNS方式连接数据库,而不能用这种: Data Source=(DESCRIPTION =(ADDRESS = (PROTOCol = TCP)(HOST = 192.168.1.34)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_name = ORC)));User ID=admin;Password=admin; 否则报错: 连接选项“Data Source”的长度无效,最大长度为 128 开发支持Oracle的.Net程序,标准流程是先安装Oracle客户端,然后使用.Net自带驱动或者ODP.Net。其实只要按照这个流程来做,基本上不会有错误,要错也只是TNS错而已。而最令人忍受不了的就是,Oracle客户端实在是无比庞大,尽管后来可以只安装Oracle客户端运行时,仍然很大。于是,就有高手制作精简版客户端,这个网上很多,效果也非常不错。 当然啦,Oracle官方也没闲着,推出了InstantClIEnt,不到30M的msi安装程序。总算是摆脱了那个巨大的客户端。 但是,人的欲求是无止境的!有了更小的运行时,为了方便,我们还希望能做到免安装,伴随着我们开发的主程序拷贝过去就能用。经过多方求证,Oracle客户端运行时的关键在于OCI,也就是说,不管用什么语言写的程序,只要能找到运行时的oci.dll,基本上就能链接Oracle数据库了。 通过反编译ODP.Net里面的Oracle.DataAccess.dll发现,它会先找注册表,然后是配置文件,从中找一些设置,第一个就是DllPath,我估计这个就是OCI的路径。于是备份了InstantClIEnt安装后的文件,然后把它卸载了,并确保注册表没有残留。释放备份的文件,在项目配置文件里面指定路径: 实际上是增加一个段: <configSections> <section name="oracle.dataaccess.clIEnt" type="System.Data.Common.DbProvIDerConfigurationHandler,System.Data,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089" /> </configSections> 然后再设置DllPath:<oracle.dataaccess.clIEnt> <settings> <add name="DllPath" value="D:\Oracle\OCI" /> </settings></oracle.dataaccess.clIEnt> 让测试代码跑起来,一切正常!这说明,只要能找到oci.dll所在目录,程序就可以正常工作。当然,如果把这个目录的文件直接放到软件目录中,也是可以使用的。到这里,习惯的想,只要把那些安装后的文件拷贝走,就可以使用了。但打包的时候才发现,InstantClIEnt的安装文件虽然不到30M,但是安装之后足足139M(下图实际上是最新的驱动2.112.2.0,网上的InstantClIEnt是2.112.1.0,两者文件基本一样): 图中可以看到,罪魁祸首是oraocIEi11.dll这个,它就占了126M。上网搜索各种Oracle客户端精简方案,必要的几个文件:oci.dll、orannzsbb11.dll、oraocci11.dll、oraocIEi11.dll,它是必不可少的呀……当然,还有两个:Oracle.DataAccess.dll、OraOps11w.dll,有些安装包会把OraOps11w.dll跟OCI放在一起,也是可以的。 伤不起呀!这几个文件就127M了,最高压缩,也有30M,并且解压还特别慢!(这个压缩包后面提供下载) 难道除了这个就没办法更小了吗?不是的!朋友告诉我一个很小的运行时oracle9i310(网上有扣积分下载,后面提供本地下载),才13M,不过需要安装。但是这个运行时比较难缠,如果用最新的Oracle.DataAccess.dll去连接,会报版本不匹配! (这里插一段关于版本不兼容的说明)The provIDer is not compatible with the version of Oracle clIEnt提供程序与此版本的 Oracle 客户机不兼容这个可是开发.Net For Oracle程序中最常见的错误了。实际上,这是使用ODP.Net经常遇到的问题,在ODP.Net中,Oracle.DataAccess.dll=>OraOps11w.dll=>oci.dll,前面两者的版本必须100%匹配(OraOps11w.dll里面通过硬编码写死了的)(也许这就是Oracle官方把OraOps11w.dll跟Oracle.DataAccess.dll放在一起的原因)。后面两者的版本似乎要求不高,是C++之间的引用。而.Net的Oracle驱动,版本要求就非常低了,只要能找到oci.dll,基本上就能很好工作,它不会去检查版本什么的。如果找不到oci.dll呢,就会报这个错误:System.Data.OracleClIEnt 需要 Oracle 客户端软件 8.1.7 或更高版本。当然,光有OCI目录(在环境变量Path中设置)不行,还得设置环境变量ORACLE_HOME为OCI目录,否则报错(因为oci.dll要用别的dll):OCIEnvCreate 失败,返回代码为 -1,但错误消息文本不可用。 言归正传!最新的ODP.Net驱动无法使用oracle9i310运行时,那么试试MS的。设置环境变量ORACLE_HOME为oracle9i310目录,在环境变量Path中添加其下的bin目录(oci.dll在里面)。测试正常!这表明,9i运行时支持绿色发布。 下一步,就应该是开始精简这个oracle9i310了。 不到13M的安装包,安装后只有35M,远远比最新的ODP.Net驱动要小,压缩后不到9M。删除一些不必要的东西后,剩下28M,压缩得到6.5M。这应该算是最小的Oracle客户端运行时了。 综合比较: .Net自带Oracle驱动 ODP.Net驱动 连接字符串TNS写法 支持 支持 连接字符串非TNS写法 不支持 支持 是否支持Oracle9运行时 支持 不支持 是否支持Oracle11运行时 支持 支持 OCI目录设置方式 环境变量Path中设置 环境变量Path中设置或配置文件设置DllPath或注册表设置DllPath 其它环境变量 需要设置ORACLE_HOME 无 运行时安装包大小 9i运行时安装包13M 11g运行时安装包30M最新ODP.Net共52M 绿色精简后大小 9i运行时6.5M 11g运行时30M 据说的差别 性能底下,功能特性少 性能最高,功能特性多
以上是内存溢出(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
总结以上是内存溢出为你收集整理的Oracle免客户端For .Net(增加分析Devart和DataDirect)全部内容,希望文章能够帮你解决Oracle免客户端For .Net(增加分析Devart和DataDirect)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)