ASP.NET连接Oracle — 末日前的最后折腾
由于新系统的部分功能需要和另外一家公司做数据对接,而我们自家的系统采用的是Sql Server R2数据库,对方的数据库为Oracle 11g。就涉及到在ASP.NET程序中连接Oracle数据库。这就是末日前我的工作。
在.NET Framework 4.0中,已经内置了对 Oracle数据库操作的支持。只需要添加引用:System.Data.OracleClient。然后和连接SqlServer一样,直接使用:OracleConnection,OracleCommand,OracleDataReader等属性即可。
但如果你使用上面的连接方式,VS将会提示 System.Data.OracleClient 下面的相关操作已弃用。同时,MSDN上面对Oracle and ADO.NET的介绍中,也有以下说明:
The types in System.Data.OracleClient are deprecated. The types are supported in version 4 of the .NET Framework but will be removed in a future release. Microsoft recommends that you use a third-party Oracle provider.
老大的意思是:虽然目前在.NET Framework 4.0版本中集成了相关操作,但将来的.NET版本极有可能把它清理出去。并建议采集第三方的类库完成Oracle的连接。
感觉这个东西就像个小姐,年轻的时候陪吃陪睡,张开腿就能挣钱,但说不定哪天人老珠黄,立马滚蛋。虽然如此,由于时间关系,(必须抓紧时间享受末日前的宁静),仍然采用了上述龌龊的连接方式。
然后,就像经常Call Lady的同志容易患花柳,梅毒,艾滋。接下来的两个小时我也被折腾的够呛。
首先是在连接测试的时候提示以下信息:
System.Data.OracleClient requires Oracle client software version 8.1.7 or greater
起初以为是 System.Data.OracleClient 过期或者Oracle版本导致的问题,男人的这种直觉直接导致我接下来的很长一段时间不得其门而入。随后,在全能神的帮助下找到了如下解决方案:
当Oracle 9.2运行在NTFS的分区上时,对于某些非administrator组的用户,ORACLE_HOME 目录是不可见的,而在windows server 2003下asp.net应用使用的帐户是netword service,因此无法创建oracle连接,只要重设一下ORACLE_HOME目录的权限就可以了。步骤如下:
1、以管理员的用户登录;
2、找到ORACLE_HOME文件夹(本人的是D:\oracle\ora92,不要对着ORACLE文件夹修改,因为ORACLE_HOME文件夹是oracle下面的那个ora92文件夹),点右键,选属性--安全,在组或用户栏中选“Authenticated Users”,在下面权限列表中把“读取和运行”的权限去掉,再按应用;重新选上“读取和运行”权限,点击应用;选权限框下面的“高级”按钮,确认“Authenticated Users”后面的应用于是“该文件夹、子文件夹及文件”,按确定把权限的更改应用于该文件夹;
3、重新启动计算机,让权限设置生效;
4、登录后运行asp.net应用,正常取得Oracle数据库的数据。
由于 Oracle 数据库安装在第三方的服务器上面,同时上面又运行着正式的对外系统。上述引用的第3条“重启计算机”会带来诸多不便。值得庆幸的是,经过本人测试,只需要重启IIS即可:iisreset /RESTART。
这样折腾了一回,之前的提示信息便消失了。但又出现了让人蛋疼的新问题:
Attempt to load Oracle client libraries threw BadImageFormatException. This problem will occur when running in 64 bit mode with the 32 bit Oracle client components installed.
由于几乎肯定不能干预第三方的Oracle客户端组件的安装,就只有在本地想办法,首当其冲的便是IIS。于是,接下来我便又开始探索IIS的各项设置。天可怜见,终于让我找到上述问题的解决方法:
IIS管理器,应用程序池,设置应用程序池默认设置,启动32为应用程序,设置为true ,确定。
再次测试,已成功连接。此时,距第一次问题的出现已过去了接近两个钟头。猛然一阵尿意!