日期:2014-05-16 浏览次数:20418 次
? 我只是一名普通的.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> <