zoukankan      html  css  js  c++  java
  • 【转】Windows环境下.NET 操作Oracle问题

    目前,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,如图所示:

    0_1322830908vItw

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

    0_1322830875I32K

    这样设置后,每次运行就好以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.1instantclient_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账户没有访问Oraclein文件夹的权限
    2. 在 Windows Server 2003/2008 的 NTFS系统中提供了高级的访问安全性,FAT32系统也许没有这个问题。

    解决办法如下:

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

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

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

  • 相关阅读:
    Java swing 代码例子
    MySql
    swing 下拉菜单
    uiautomator2.0的配置的两种方法
    【Java】边框总结
    Java可视操作界面例子
    Java多线程例子
    使用Java让android手机自动执行重复重启
    形参的一种特殊写法
    this 基础使用方法
  • 原文地址:https://www.cnblogs.com/benbenzlj/p/3186367.html
Copyright © 2011-2022 走看看