我如何在.NET中使用Oracle?

时间:2012-07-06 17:08:15

标签: c# .net oracle

不幸的是,我试图从.NET使用Oracle,它就像回到1997年一样。正确解释事情是一个弱点的迹象,注册表和环境变量似乎有特色。

所以,我已经走了多远。

我在Oracle.com上填写了一份关于我生活的大表,然后下载了

ODBC Windows 64位实例客户端,11.2.0.3.0 并将其解压缩到一个文件夹中。 基本Windows 64位Instant Client,11.2.0.3.0 ,并将其解压缩到与上面相同的文件夹中。

我运行了安装.exe(没有MSI,请记住这是1997年)。

我添加了一个TNS_NAMES环境变量,指向网络共享上的公司TNSNames.ora文件,并在控制面板中设置一个快速DSN并运行测试 - 它工作正常!

然后我下载了最新的ODP.NET for .NET 4.0的XCOPY版本,并将其复制到我的源代码管理工作区下的Dependencies文件夹中。

我在项目中添加了一个引用 Dependencies \ odp.net4 \ odp.net \ bin \ 4 \ Oracle.DataAccess.dll

我已经读过,我需要让托管的ODP.NET知道它在哪里可以找到它的非托管Oracle库,我猜测它是 Dependencies \ odp.net4 \ bin \ OraOps11w .dll 但它可能是其他一些Oracle二进制文件?

现在我正在设置名为DllPath的配置文件参数。遗憾的是,Oracle文档似乎没有意识到.NET配置文件需要在configSections部分中连接它们的部分。

这是配置文件部分。

<oracle.dataaccess.client>
  <add key="DllPath" value="D:\Trunk\Dependencies\odp.net4\bin" />
</oracle.dataaccess.client>

configSection中有什么内容?我在这上面找到的几个主题就是一个例子然后说'#34;我不知道什么类型=应该是&#34;,这是主要的一点!

有人可以告诉我吗?有没有人知道从.NET查询Oracle视图的虚拟指南的链接?

我能否在1997年做些什么来阻止自己在2012年使用Oracle?

更新

快速更新。我已将OraOps11w.dll复制到我的输出bin文件夹中,并删除了之前添加的任何web.config文件更改。

我现在得到以下错误,我正在研究。

  

无法加载文件或程序集&#39; Oracle.DataAccess&#39;或其中一个   依赖。尝试加载程序不正确   格式。

其他一些论坛谈论在GAC中注册Oracle.DataAccess.dll,我很想避免 - 而且无论如何我都看不出有什么区别,但我会给出它去了。

更新2

在GAC中注册Oracle.DataAccess.dll库没有任何区别,我没有注册它。

工作周结束了,我必须赶上火车,但是我已经通过电子邮件发送了另一个开发团队,并希望他们之前已经打过这场战斗(而不是像每个人那样使用夜间提取物其他人)。

更新3

今天早上我下载并安装了64位版本的IIS Express 8.0 RC。 VS2010不支持64位版本,因此需要从命令行运行。这很简单,通过查看任务管理器,我能够看到VS用于iisexpress.exe * 32的命令行。

不幸的是,当浏览到由64位IIS Express托管的我的站点时,我收到此错误。

  

Handler&#34; ExtensionlessUrl-Integrated-4.0&#34;有一个糟糕的模块   &#34; ManagedPipelineHandler&#34;在其模块列表中

这个问题在这条问题上太过分了,所以我将尝试使用32位版本的ODP.NET。

更新4

我下载了32位版本的完整安装,但是在看到Oracle Universal Installer时我感到很害怕。与我珍贵的开发盒相信它看起来太过90年了。所以我使用的是32位&#39; XCopy&#39;客户端,这让我可以打开我网站的主页,所以推荐工作正常。感谢那些暗示架构不匹配32/64问题的人。

现在我在实例化一个新的OracleConnection时正在研究这个错误。

  
    

提供程序与Oracle客户端版本不兼容

  

更新5 我想我已经完成了。

所以我下载了32位最新的11g&#34; Instant Client&#34;并将其放在解决方案中继代码库的\ Dependencies文件夹中。我将此文件夹添加到%PATH%系统环境变量中,并将OraOps11w.dll文件放在那里。

最后,_oracleConnection = new OracleConnection(connectionString)不会抛出!现在我需要确保当我部署到prod时我在桌面上放了一瓶Laphroaig。

因此,回顾一下,对于Windows 7,64上的IIS Express 7.5(这是一个32位进程):

  • 下载并解压缩32位11g&#34; Instant Client&#34;到某个文件夹并将此位置添加到您的PATH。 Oci.dll是主要的Oracle客户端非托管库。

  • 将32位ODP.NET下载并解压缩到某个文件夹。

  • 将OraOps11w.dll复制到Instant Client所在的主文件夹(上图)。

  • 添加一个TNS_ADMIN环境变量,指向TNSNames.ora文本文件所在的文件夹。这类似于hosts文件,并将Oracle服务名称映射到服务器主机名。

  • 关闭并重新打开Visual Studio以确保您获取新的环境变量,并在ODP.NET文件夹中添加对Oracle.DataAccess.dll托管程序集的引用。

那应该是它。当你知道如何时,听起来很简单。

更新5.1

调查下面的错误,我最初没有报告,因为我确定它是防火墙问题。我所在的公司在每个工作站上有两个,但我只是打开了一个原始套接字到Oracle服务器,所以它不可能。

  
    

ORA-12541:TNS:没有听众

  

5 个答案:

答案 0 :(得分:5)

解释该问题的最简单方法是指出Oracle客户端和ODAC客户端库之间的区别。

在64位计算机(Windows 7+)上,您需要安装64位Oracle客户端。这是您的计算机将用于连接到计算机本地部署的Oracle数据库的客户端。对于托管在Web服务器或其他终端服务器上的应用程序,规则是相同的。

诀窍是......作为开发人员,我们的机器也必须具有.Net IDE工具。 Oracle有一个糟糕的命名约定,但基本上有2个部分:ODT(工具)和ODAC(数据访问)。 ODP.Net数据提供程序是ODAC库的一部分。

所以...回到IDE ... Visual Studio是32位,因此我们必须以32位安装上面的工具。

在开发,调试等时,VS.Net正在使用32位客户端库和数据访问库与Oracle协同工作。

只要将此应用程序部署到计算机,它就会使用计算机上加载的任何客户端,除非针对特定平台。

这意味着如果您的目标是32并部署到64,它将会中断...反之亦然。最好的办法是将它留在任何平台部分,并记住你到底在做什么:)

另外要注意的是确保您的客户端和ODAC包都是相同的版本...您不希望拥有11g R2客户端和11g R5 ODAC,因为只要您部署,废话再次破裂。


这里需要注意的是,如果您希望在应用程序中“嵌入”oracle客户端,在这种情况下,OraOps与其他几个库一起部署在应用程序中 - 这称为Oracle的Instant Client,也是ODAC的一部分包,并包含在他们完整的客户端包中。


好消息......

Oracle即将(2013年第1季度)发布他们的下一个ODP.Net软件包......这将是一个完全托管代码库...这意味着没有更多单独的客户端或ODAC软件包可以匹配,平台将是不知道32位和64位的区别......它的功能就像旧的微软库一样,只有它将由oracle构建和维护,具有更强大的功能集。我希望它能早点到达。

答案 1 :(得分:3)

过去我花了尝试在Windows 7中连接Oracle。

我遇到的问题是我有一个安装了32位Oracle ODP.NET驱动程序的32位ASP.NET应用程序。我不知道,即使ASP.NET应用程序作为32位进程运行并需要32位ODP.NET,IIS是一个64位进程并导致ODP.NET访问64位注册表键。您没有提到是否尝试为ASP.NET设置Oracle,但我将分享我的修复(尽管它是针对Oracle 10.2安装的)

我正在逐字复制my blog post

注意:这会强制Oracle 11.2.0.1仅在64位环境中使用32位。

我犯的第一个错误是在Windows 7上安装Oracle 10g客户端。这不起作用。如果你安装它,你将不得不在之后进行一些清理。

  • 访问Oracle的站点并下载/安装11g 32位和64位客户端。
  • Go here并按照“Dummy注册表项”步骤进行操作。
  • 打开注册表并验证HKLM\SOFTWARE\Wow6432Node\ORACLE\inst_loc是否指向正确的位置(可能是C:\ oracle \ Inventory)
  • 将注册表项HKLM\SOFTWARE\Wow6432Node\ORACLE\VOBHOME2.0指向32位Oracle文件夹
  • 创建一个ORACLE_HOME环境变量并将其指向32位文件夹。

现在你应该在重启后全部设定。

如果您尝试安装Oracle 10g客户端,则必须执行一些清理。首先,确保完全卸载Oracle 10g,从PATH变量中取消引用,并删除目录。然后,找到GAC中引用的程序集:

gacutil /l | find /i "Oracle" > c:\[some directory]\oracle.txt

找到引用Oracle.DataAccess版本10.2的行并将其从GAC中删除。作为示例(除非您安装了相同的版本,否则这将无效):

gacutil /u "Oracle.DataAccess, Version=10.2.0.100, Culture=neutral, PublicKeyToken=89b483f429c47342"

当我这样做时,我有三个要删除的程序集:

  1. Oracle.DataAccess
  2. Policy.10.1.Oracle.DataAccess
  3. Policy.9.2.Oracle.DataAccess
  4. 同样,你可能需要重启(嘿,这是Windows)。


    如果您需要进行任何清理,我还blogged about that

    供参考
    如果指向“虚拟注册表项”步骤的链接死亡,这里是Gadi发布的文章:

    “” 嗨本,

    在设计时,使用SQL Server Business Intelligence Development Studio时,Oracle Connector以32位模式运行,因此它会加载32位Oracle客户端。

    最有可能的是,您收到错误是因为连接器正在加载错误的Oracle客户端(oci.dll),其中未定义TNS服务。

    要解决此问题,您有两种选择:

    1. 指定Oracle连接字符串,而不是Oracle Connection Manager编辑器中的TNS服务名称,例如,采用以下格式:host:port/service_name

    2. 定义虚拟注册表项(Z_SSIS),如下所示:

      • 打开regedit实用程序。
      • 找到以下密钥:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE
      • 右键单击ORACLE节点,然后单击New - &gt;键。
      • 调用新密钥Z_SSIS(以确保它是最后一个条目)。
      • 右键单击Z_SSIS节点,然后点击新建 - &gt;字符串。
      • 将属性命名为ORACLE_HOME
      • 双击ORACLE_HOME并将其设置为您要使用的Oracle 32Bit安装主目录的位置。
    3. 此致

      迦底 “”

答案 2 :(得分:1)

首先,为您对Oracle的纯粹热爱+1,并意识到他们是拥有最佳产品的最佳公司! ;)


是的,下载和安装过程非常荒谬。我通常甚至无法在他们的网站上找到合适的客户端下载,而且Oracle Universal Product Installer的功能非常糟糕。


有时您需要OraOps11w.dll目录中的\bin副本。有时不是。我从来没有弄清楚它何时需要,什么时候不需要,但我认为如果你引用的Oracle.DataAccess.dll 完全与已安装的Oracle客户端完全相同,那么你需要OraOps11w.dll


您可以使用DllPath解释您在配置文件中尝试执行的操作吗? Oracle安装应该已经在.NET运行时的machine.config中注册了所需的全部内容。自从我设置ODP.NET以来已经有一段时间了,但是我不记得除了连接字符串之外还有很多东西放在app.config中。

答案 3 :(得分:1)

我不相信这是一个路径问题。 “尝试加载格式不正确的程序。”是一个错误,几乎总是意味着您在.NET中混合使用32位和64位程序集和DLL。

我注意到你安装了64位Oracle客户端,我假设自DSN创建工作以来你在64位版本的操作系统上?您的问题可能来自许多相关场景:

  • 您的OraOps11w.dll副本可能是32位程序集,您在64位应用程序中使用它
  • 您的OraOps11w.dll副本可能是64位程序集,并且您尝试从32位应用程序中使用它
  • Oracle数据提供程序for .NET的非托管依赖项之一是32位,无法加载到32位应用程序中(反之亦然)

我相信如果您的应用专门针对x86,您必须安装32位Oracle客户端软件包,无论底层操作系统平台如何(例如,即使您是32位应用程序,您仍然需要32位Oracle客户端)使用64位版本的Windows)

要检查的几件事情:

  • 检查程序集中调用Oracle提供程序的“平台目标”设置:x64将始终尝试以64位运行,x86将始终尝试以32位运行,并且“任何平台”将JIT编译为运行时的目标OS体系结构(x86系统上为32位,x64系统上为64位)
  • 通过 corflags.exe 运行OraOps11w.dll(详见 at this SO post )以查看它是32位,64位还是“任何CPU” “

最后,您是否尝试过为Oracle内置的.NET数据提供程序(System.Data.OracleClient命名空间?)

这是我能做的最好的事情,因为我对你的应用程序的项目设置了解不多。

答案 4 :(得分:-1)

我遇到了同样的问题,发现在Oracle.DataAccess.dll 11.x软件安装的副本版本中运行取消配置并配置bat文件可能会解决或帮助解决问题。

E.G。 configure.bat xxx.netx xxx \ product \ 11.2.0 \ client_1