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

结果这样生成的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 或更高版本

在用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.csdn.net/zouyujie1127/article/details/6371165

【转】Windows环境下.NET 操作Oracle问题的更多相关文章

  1. Windows环境下,本地Oracle创建dblink连接远程mysql

    前言 我的情况是,本地安装了oracle(安装完成后带有SQL Developer,不需要再安装instantclient),创建dblink去连接远程的mysql.有些朋友可能是 本地使用PL\SQ ...

  2. Windows环境下google protobuf入门

    我使用的是最新版本的protobuf(protobuf-2.6.1),编程工具使用VS2010.简单介绍下google protobuf: google protobuf 主要用于通讯,是google ...

  3. Windows环境下在Oracle VM VirtualBOX下克隆虚拟机镜像(克隆和导入)

    Windows环境下在Oracle VM VirtualBOX下克隆虚拟机镜像: 注:直接复制一个.vdi 虚拟硬盘再挂上去就可以,但Virtualbox居然提示UUID重复,无法使用. 则,可以通过 ...

  4. Windows环境下Oracle数据库的自动备份脚本

    批处理文件(.bat) @echo off echo ================================================ echo  Windows环境下Oracle数据 ...

  5. windows环境下protobuf的java操作{编译,序列化,反序列化}

    google protocol buffer的使用和原理 概况: Protocol Buffers(也就是protobuf)是谷歌的语言中立的.平台中立的.可扩展的用于序列化结构化的数据: windo ...

  6. Windows环境下修改Oracle实例监听IP地址

    Windows环境下修改Oracle实例监听IP地址. 配置文件路径:<ORACLE_HOME>\NETWORK\ADMIN 如:C:\Oracle11gR2\product\11.2.0 ...

  7. Windows环境下Oracle数据库的自动备份脚本自动删除30天前的备份

    @echo off echo ================================================ echo Windows环境下Oracle数据库的自动备份脚本 echo ...

  8. windows环境下安装pymysql(操作带图)

    在windows环境下安装pymysql,首先要找到python的安装位置,如果在c盘,启动cmd的时候,要获取管理员权限. 具体步骤,一,管理员模式启动cmd.在箭头指定位置,搜索cmd,出现快捷方 ...

  9. Windows环境下启动Redis报错:Could not create server TCP listening socket 127.0.0.1:6379: bind: 操作成功完成。(已解决)

    问题描述: 今天在windows环境下启动Redis时启动失败报错: 解决方案: ①运行命令:redis-cli.exe ②退出Redis ③运行命令:redis-server.exe redis.w ...

随机推荐

  1. codeforces C. Jzzhu and Chocolate

    http://codeforces.com/contest/450/problem/C 题意:一个n×m的矩形,然后可以通过横着切竖着切,求切完k次之后最小矩形面积的最大值. 思路:设k1为横着切的次 ...

  2. spring定时任务的配置使用

    spring的定时任务配置分为三个步骤: 1.定义任务 2.任务执行策略配置 3.启动任务 1.定义任务 <!--要定时执行的方法--> <bean id="testTas ...

  3. 最完整的合并相交集合的Java代码(查并集)

    这个是自己写的算法,如果有大牛,麻烦帮我并行化.初学者则可以学到不少东西. 产生测试用例 import java.io.*; import java.util.Random; public class ...

  4. hdu 2289 Cup (二分法)

    http://acm.hdu.edu.cn/showproblem.php?pid=2289 二分法解题. 这个题很恶心...一开始测试样例都不能过,这个π一开始取3.1415926结果是99.999 ...

  5. 利用merge优化

    create table a1(TP_END_DATE NUMBER,WK_END_DATE NUMBER, MTH_START_DATE NUMBER, MTH_END_DATE NUMBER, T ...

  6. wpf 自定义依赖性属性 作用之一 对数据绑定的支持

    依赖属性:定义,声明,注册 依赖属性,在数据绑定中,数据绑定,分为源对象(数据源)和目标对象(显示数据). 只有源对象为依赖对象,属性为依赖属性时,该属性才会在属性发生变化时,通知目标对象进行数据更改 ...

  7. KK的新书《必然》对未来科技趋势的预言

    是他第一次在<失控>中提示我们--  要用生物学而不是机械学的角度看待这个世界.  是他第一次在<科技想要什么>提示我们--  科技本身就是一个生命体.  而在新书<必然 ...

  8. [学习整理]eclipe/MyEclipse:重要的快捷键

    一.查看大工程代码最重要的几个快捷键 其实有一些,直接在编辑器页面内右键也可查看相应的快捷键(比如F3,F4,Ctrl+O,Ctrl+T),但有些比较好用的快捷键,并不能能直接或方便地在eclipse ...

  9. 利用qemu模拟嵌入式系统制作全过程

    http://www.tinylab.org/using-qemu-simulation-inserts-the-type-system-to-produce-the-whole-process/ 利 ...

  10. C#添加资源的两种方式

    1.粘贴到项目Properties中的Resources.resx中 base.m_bitmap = Properties.Resources.MeasuredisTool; 2.添加已有资源中的bm ...