我如何在.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部分中连接它们的部分。

这是配置文件部分。

   

configSection中包含哪些内容? 我在这上面找到的几个线程给出了一个例子,然后说“我不知道应该是什么类型”,这是主要的一点!

任何人都可以建议我吗? 有没有人知道从.NET查询Oracle视图的傻瓜指南的链接?

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

UPDATE

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

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

无法加载文件或程序集“Oracle.DataAccess”或其依赖项之一。 尝试加载格式不正确的程序。

其他一些论坛谈论在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托管的我的站点时,我收到此错误。

处理程序“ExtensionlessUrl-Integrated-4.0”在其模块列表中有一个错误的模块“ManagedPipelineHandler”

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

更新4

我下载了32位版本的完整安装,但是当我看到Oracle Universal Installer时我感到很害怕。 用我珍贵的开发盒子看起来太过90年了。 所以我正在使用32位’XCopy’客户端,这让我可以打开我网站的主页,所以引用正在运行。 感谢那些暗示架构不匹配32/64问题的人。

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

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

更新5我想我已经做到了。

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

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

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

  • 将32位11g“Instant Client”下载并解压缩到某个文件夹,然后将此位置添加到PATH中。 Oci.dll是主要的Oracle客户端非托管库。

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

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

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

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

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

更新5.1

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

ORA-12541:TNS:没有倾听者

解释该问题的最简单方法是指出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位的区别……它的function就像旧的微软库一样,只有它将由oracle构建和维护,具有更强大的function集。 我只希望它能早点到达。

我过去花了几天时间尝试在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安装的)

我正在从我的博客文章中逐字复制

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

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

  • 转到Oracle的站点并下载/安装11g 32位和64位客户端。
  • 转到此处并按照“虚拟注册表项”步骤操作。
  • 打开regedit并validationHKLM\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

再次,您可能需要重新启动(嘿,它是Windows)。


如果你需要进行任何清理,我也会在博客上发表这个问题

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

“嗨本,

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

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

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

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

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

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

问候,

加迪“”

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


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


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


你能用DllPath解释你在配置文件中想要做什么吗? Oracle安装应该已经在.NET Runtime的machine.config注册了它所需的一切。 自从我设置ODP.NET以来已经有一段时间了,但是我不记得除了连接字符串之外还有很多东西放在app.config中。

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

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

  • 您的OraOps11w.dll副本可能是32位程序集,您在64位应用程序中使用它
  • 你的OraOps11w.dll副本可能是一个64位程序集,你试图从32位应用程序使用它
  • Oracle Data Provider for .NET的非托管依赖项之一是32位,无法加载到32位应用程序中(反之亦然)

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

要检查的几件事:

  • 检查调用Oracle提供程序的程序集中的“Platform Target”设置:x64将始终尝试以64位运行,x86将始终尝试以32位运行,并且“Any Platform”将JIT编译为目标OS体系结构在运行时(x86系统上为32位,x64系统上为64位)
  • 通过corflags.exe运行OraOps11w.dll(请参阅此SOpost中的详细信息)以查看它是32位,64位还是“任何CPU”

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

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

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

EG configure.bat xxx.netx xxx \ product \ 11.2.0 \ client_1