zoukankan      html  css  js  c++  java
  • 转载 在Windows64位环境下.net访问Oracle解决方案

    转载 在Windows64位环境下.net访问Oracle解决方案

    原文:http://blog.csdn.net/zouyujie1127/article/details/6371165

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

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

    Oracle Instant Client的下载地址

    http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html

    以下所有的说明都是基于Windows64位的(以Windows2008为例)

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

    1 安装Oracle64位客户端(win64_11gR2_client):

    下载页面:

    http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win64soft-094461.html

    下载地址:

    http://download.oracle.com/otn/nt/oracle11g/112010/win64_11gR2_client.zip

    已经下载到\\192.168.9.24\常用软件\Oracle\win64_11gR2_client.zip

    然后正常安装,并进行数据库连接的配置,比如tnsnames.ora

    2 将NetWork Service用户加入Administraotr组中,重启计算机(重要)

    3 新建asp.net网站,配置程序的调试模式为使用IIS,不要使用WebServer,这样就可以调试了

    4 由于Webserver是32位的程序,因此如果要使用webserver进行调试,可以考虑安装32位的Oracle客户端(没有进行测试)。

    注意:对于已经安装了32位Oracle客户端的情况,本次没有测试

    2安装顺序

    http://wangyj.blog.163.com/blog/static/85232558201081971322105/

    安装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调试

    http://www.cnblogs.com/studyzy/archive/2010/10/28/1863056.html

    我们平时使用的都是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,如图所示:

    结果这样生成的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客户端。具体设置如下:

     

    这样设置后,每次运行就好以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 或更高版本

    http://www.cnblogs.com/TerryFeng/archive/2009/02/23/1396625.html

    在用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”。

  • 相关阅读:
    Balanced Binary Tree
    Convert Sorted List to Binary Search Tree
    Convert Sorted Array to Binary Search Tree
    Binary Tree Zigzag Level Order Traversal
    Validate Binary Search Tree
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Maximum Depth of Binary Tree
    如何把U盘的两个盘或者多个盘合成一个
    bugku 想蹭网先解开密码
  • 原文地址:https://www.cnblogs.com/asingna/p/2519950.html
Copyright © 2011-2022 走看看