惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
爱范儿
爱范儿
H
Help Net Security
V
Visual Studio Blog
J
Java Code Geeks
Stack Overflow Blog
Stack Overflow Blog
Microsoft Security Blog
Microsoft Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
MyScale Blog
MyScale Blog
The Cloudflare Blog
Martin Fowler
Martin Fowler
D
Docker
腾讯CDC
F
Fortinet All Blogs
雷峰网
雷峰网
GbyAI
GbyAI
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Blog — PlanetScale
Blog — PlanetScale
Engineering at Meta
Engineering at Meta
博客园 - 聂微东
博客园 - 叶小钗

博客园 - blueKnight

Java根据WSDL生成request的SOAP报文模板 【转】HttpClient使用Post和Get提交参数 Java解析Soap XML HttpClient示例 【转】C++标准库和标准模板库 dotNetFrameWork 3.5SP1离线安装 笔记本电脑win7创建WIFI热点 【转】ORA-00257 archiver error. 错误的处理方法 数学表达式与二叉树 FIREFOX不支持font-family: webdings;怎么办? "5","6"排序上下箭头问题 【转】Eclipse插件开发之基础篇(1) 插件开发的基础知识 http MIME大全 在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码) FreeMarker示例 转:用XML编写EXCEL文件 【网摘】BI系统(Business Intelligence) js获取周.html 关于j2ee工程发布到was上后,部分更新,例修改web.xml配置文件不起作用的原因解析 SSI(Struts2+Spring2+IBatis)代码生成器(纯Java版)
【转】Oracle免客户端For .Net(增加分析Devart和DataDirect)
blueKnight · 2012-06-28 · via 博客园 - blueKnight

   
我只是一名普通的.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安装后的文件,然后把它卸载了,并确保注册表没有残留。释放备份的文件,在项目配置文件里面指定路径:

image

实际上是增加一个段:

  <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,两者文件基本一样):

image

图中可以看到,罪魁祸首是oraociei11.dll这个,它就占了126M。上网搜索各种Oracle客户端精简方案,必要的几个文件:

oci.dll、orannzsbb11.dll、oraocci11.dll、oraociei11.dll,它是必不可少的呀……

当然,还有两个:Oracle.DataAccess.dll、OraOps11w.dll,有些安装包会把OraOps11w.dll跟OCI放在一起,也是可以的。

image

伤不起呀!这几个文件就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了。

image

不到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运行时安装包13M11g运行时安装包30M
最新ODP.Net共52M
绿色精简后大小9i运行时6.5M11g运行时30M
据说的差别性能底下,功能特性少性能最高,功能特性多


下载地址:

Oracle9i客户端运行时精简版 6.5M

Oracle11g客户端运行时精简版 30M


Oracle9i客户端运行时原版 13M

Oracle11g客户端运行时原版 52M


(下载地址随时可能变更,以最新群公告为准!)

FTP承受不了,增加网盘共享:

9i精简版:http://www.kuaipan.cn/file/id_2378544298602218.html

11g精简版:http://www.kuaipan.cn/file/id_2378544298602215.html

9i原版:http://www.kuaipan.cn/file/id_2378544298602216.html

11g原版:http://www.kuaipan.cn/file/id_2378544298602217.html


(FTP严重影响了服务器网络,现在已经关闭)


后续:

Devart dotConnect for Oracle

OneCool小胖2010的推荐下,分析Devart

1,采用名称混淆,分析有一定难度

2,采用Lic授权,很脆弱

3,发现调用OCI.DLL,发现处理Home等环境变量,看来还是离不开oci.dll

综评,跟ODP.Net比,没有优势,并且还是收费的(也有免费版)


DataDirect

在园友wizardwu一篇博客中发现了这个家伙。

image

1,产品说明非常吸引人,唯一一个100%托管代码数据提供者,不需要Oracle OCI客户端库。对,这就是我们梦寐以求的!

2,最新版本是3.5,需要申请试用。上午10点,发动群友,采用各种国内外邮箱、IP、VPN申请,均无法收到邮件。下午3点收到,开始下载。

3,上午从CSDN找到一个2.1的版本(For .Net
1.0),未混淆,采用Lic授权,支持OEM,自写的对称加密算法,内置没有任何处理的密码,很脆弱

4,从2.1版本中很清楚的看到数据封包解包,网络发送和接收的过程。没有见到任何跟OCI和HOME有关的东西。可以肯定,这是纯托管代码且不需要OCI的。

5,下午分析3.5(For .Net 2.0/4.0),名称混淆,也是Lic授权。看到类的布局,还有各个命名空间,不需要分析下去了。

综评,没错,这就是我们所需要的极品,强烈推荐!!!没找到价格,似乎必须跟他们联系。时间不多,没有做运行测试,我想网上有很多报告的!

其中2.1版,关于Oracle、SqlServer、Sybase、DB2的封包,非常具有参考价值!

2.1版下载:http://www.kuaipan.cn/file/id_2378544298602742.html

3.5版下载:http://www.kuaipan.cn/file/id_2378544298602758.html