【转】Windows环境下.NET 操作Oracle问题

时间:2024-08-10 18:33:32

目前,Windows操作系统可以分成两类,32位和64位(64位也区分x86_64位和Itanium ),同时Oracle客户端也做了同样的区分。

在安装和开发的过程中,经常会遇到一些问题,本文就总结了相关的解决方案

Oracle Instant Client  点击下载

1 解决方案(这是最终步骤,其他供参考)

  1. 安装Oracle64位客户端(win64_11gR2_client)下载页面 下载地址
  2. 将NetWork Service用户加入Administraotr组中,重启计算机(重要)
  3. 新建asp.net网站,配置程序的调试模式为使用IIS,不要使用WebServer,这样就可以调试了
  4. 由于Webserver是32位的程序,因此如果要使用webserver进行调试,可以考虑安装32位的Oracle客户端(没有进行测试)。

2 安装顺序

安装Oracle 11g Release 2 ODAC 11.2.0.1.2 with Oracle Developer Tools for Visual Studio,配置服务器tnsnames,使用SQLPLUS测试成功连接。

启动IIS,发布.NET连接ORACLE的应用,测试,报"System.Data.OracleClient 需要Oracle 客户端软件8.1.7 或更高版本"错误。解决:将ORACLE安装目录为Network Service用户赋读和执行权,并传递到所有子目录。

重启动IIS,报“尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。 ”解决:下载并解压instantclient_11_2的X64版本,放到ORACLE安装目录下,并在PATH路径中搜索在前。

重启动IIS,报“ORA-12154: TNS:could not resolve the connect identifier specified”错误。解决:指定环境变量TNS_ADMIN到tnsnames.ora所在目录。

重启动IIS,.NET应用连接数据库服务器成功。

3 在asp.net中,不用使用Webdev进行调试,必须使用IIS调试

我们平时使用的都是32位的机器进行开发,装的都是32位的软件,但是我们的服务器一般都是64位的,所以有时也需要在64位的环境下装一个VS调试程序。最近遇到的一个问题就是一个同事换了一个电脑,用的是X64的Windows 2008作为操作系统,要进行Oracle的数据库连接,所以也装了64位的Oracle客户端。如果是控制应用项目或者WinForm项目可以正常连接Oracle,但是Web项目在程序中打开Oracle连接时,系统抛出了异常:

尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。

显然,这个提示的不正确,因为我们装的就是64位的客户端,所以并不存在64位程序调用32位客户端的情况。难道是生成的程序是32位的,然后32位调用了64位的客户端,于是我把程序属性中的生成平台改为X64,如图所示:

【转】Windows环境下.NET 操作Oracle问题

结果这样生成的WebService程序在调用时还是报同样的异常。这个问题困扰了我一天,其中想到的解决办法就是把64位的客户端卸载了,在X64的操作系统中安装32位的客户端,然后这样就可以了,但是如果不是Web应用(比如控制台应用程序或者WinForm程序)却同样报错,那就需要将非Web应用的项目按照上图的设置方法,将生成的平台改为X86才能正常运行。

解决办法:

这当然是一个折中的办法,今天终于发现了真正的原因,原来VS在建Web项目时,平时运行使用的是自带的WebDev.WebServier是一个32位的服务,所以在其中运行的Web项目不管怎么设置平台,都只能作为32位的应用来看待,所以在Web项目运行时连接64位的Oracle客户端会报错,而非Web项目就不会。

网上搜了一下,好像WeDev服务好像没有64位的,所以要解决这个问题,那么就不要使用这个服务作为Web服务,而使用IIS,因为IIS使用的是w3wp,在64位的操作系统中是64位的,所以可以正常使用64位的Oracle客户端。具体设置如下:

【转】Windows环境下.NET 操作Oracle问题

这样设置后,每次运行就好以IIS来运行,不管是Web项目还是控制台应用项目或者WinForm项目,都会正常连接Oracle了。

4 使用VS开发基于Oracle程序的严重问题

基于Oracle开发时遇到
     数据连接不成功,请检查该数据库是否已启动尝试加载oracle客户端时引发BadImageFormatException.如果在安装32位Oracle客户端组件的情况下以64位模式运行,将出现此问题

  The Problem in english is :
       "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" 

    具体环境是:

      win2008  64

      vs 2010

        开发调试过程中都没有问题,一部署这个问题就来了。

       然后经过一大堆改动,改装64位Client之后的结果是:

        IIS测试都没有问题,一调试这个问题就来了。

       最奇怪的是这两个错误都是同样的错误信息。

       呵呵,两种情况都 让我碰到了,那就一起解决了他          

      我搞了整整两天才解决,网上有是有相关资料,但是都不全。具体原因也不明了.下面我来全面的讲述一下。

追根究底:  

请看下图:       

VS编译器调试过程用的并不是IIS来发布   而是用上面这个进程。我们可以看到,他明显是一个32位的。而IIS 7的进程w3wp是64 bit的。这就说明,如果我们在调试,那么我们的程序就在模拟32位运行,部署之后,确是模拟64位运行,让我最不能理解的是为什么一个是模拟32位运行,一个是模拟64位运行,而给我们的异常信息确实相同的呢?先不管这么多,至少现在这里我们可以得出一个结论:

如果你写的程序调试过程没有任何问题,那么你发布到64位IIS时就一定会有问题,反之则得到相反的结果。                     
解决方法如下:

情况一.调试过程没有任何问题,发布时出现问题

         若调试没有任何问题,那么你肯定是使用32 bit oracle client 了,而服务器的IIS是64 bit的,所以需要发布网站的话,必须安装64 bit client

实际上,System.Data.OracleClient所指向的是PATH环境变量下的oci.dll。因此,我们只要让程序能够找到64位的oci.dll就可以了。方法如下:

1. 下载instantclient-basic-win-x86-64-11.1.0.7.0.zip,并解压,如C:\instantclient-basic-win-x86-64-11.1\instantclient_11_1(这个部分也是必须的,根据实际情况的不同进行修改)。

2. 在系统的环境变量PATH中加入以上路径。

之后重启操作系统(这个是必须的,我弄了一下午没有搞好,结果重启一下马上就好了),程序会依照PATH路径寻找oci.dll,如果遇到32位的oci.dll会自动略过,找到64位的oci.dll就能连接上数据库了。

情况二.调试过程出现问题,但是在IIS上测试没有问题

           若IIS测试没有任何问题,那么你肯定使用的是64 bit oracle client 了,调试出错是因为调试的WebDev进程服务器是32bit的,为了模拟真实环境,你需要进行一些设置。

如果是这样的情况,那你就改VS的调试服务器吧,改成IIS就可以了。

       到这里,我们可以下结论,Oracle 给的异常信息对于第一种情况来说是正确的,对于第二种情况则是错误的,意思刚好相反!!!可能是做本地化人员的一个粗心错误。

      解决完这个问题之后,我的custom oracle  membership  for sharepoint的测试开发也就搞定了。近期还会记录一篇文章讲述custom oracle  membership  for sharepoint的开发总结。

5 System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本

在用VSTS2005/2008+Oracle9做环境连接Oracle时候,在VS 开发服务器运行正常,但IIS服务器调试和部署会报错!

      IIS服务器报错:System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本。

出错的原因:

  1. 虽然报的是需要安装客户端8.1.7及以上版本,实际是.net账户没有访问Oracle\bin文件夹的权限
  2. 在 Windows Server 2003/2008 的 NTFS系统中提供了高级的访问安全性,FAT32系统也许没有这个问题。

解决办法如下:

我用Windows Server 2008 为例 Windows Server 2003 是一样的

  1. 打开安装有Oracle客户端的电脑,在安装目录 C:\oracle\ora90\BIN 文件夹上右键-》安全选项卡-》点击  编辑---》添加。
  2. 点击“查找范围”,在下面显示的账户中选择“NTWORK SERVICE”  ----将“读取和执行”的权限都赋给他(如果不行就把完全控制给他,这样不安全),子文件夹继承此权限,确定。
  3. 打开“服务器管理器”-》配置-》 本地用户和组-》组-》adminisgrators-》将Network Service 添加进来
  4. 重新启动IIS,在“运行”中输入“IISRESET”。

原文地址:http://blog.****.net/zouyujie1127/article/details/6371165