【问题标题】:How do I use Oracle from .NET?如何从 .NET 使用 Oracle?
【发布时间】:2012-07-07 04:15:52
【问题描述】:

不幸的是,我正在尝试使用 .NET 中的 Oracle,这就像回到 1997 年。正确解释事情是弱点的标志,而且注册表和环境变量似乎很重要。

这就是我已经走了多远。

我填写了一份关于我在 Oracle.com 生活的巨大表格并下载了

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

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

我在网络共享上添加了一个指向公司 TNSNames.ora 文件的 TNS_NAMES 环境变量,并在控制面板中设置了一个快速 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 中有什么内容?我找到的几个线程给出了一个例子,然后说“我不知道 type= 应该是什么”,这是主要的一点!

谁能给我建议?有谁知道从 .NET 查询 Oracle 视图的傻瓜指南的链接?

我可以在 1997 年做些什么来避免自己在 2012 年不得不使用 Oracle 吗?

更新

只是一个快速更新。我已将 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 的命令行。

很遗憾,我在浏览由 6​​4 位 IIS Express 托管的网站时收到此错误。

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

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

更新 4

我下载了 32 位版本的完整安装,但是当我看到 Oracle Universal Installer 时我很害怕。它看起来太 90 年代了,无法信任我珍贵的开发盒。所以我使用的是 32 位的“XCopy”客户端,这让我可以打开我网站的主页,所以参考是有效的。感谢那些提出架构不匹配 32/64 问题的人。

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

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

UPDATE 5我想我已经做到了。

所以我下载了 32 位最新的 11g “即时客户端”,然后将它放在我的 \Dependencies 文件夹中作为解决方案主干代码库。我将此文件夹添加到 %PATH% 系统环境变量中,并将 OraOps11w.dll 文件放入其中。

最后,_oracleConnection = new OracleConnection(connectionString) 没有抛出!现在,当我开始部署到 prod 时,我需要确保桌子上有一瓶 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 合作。您不会只使用 OleDbProvider 并将其视为任何其他 OleDb 数据库吗?我知道这是 Microsoft 使用 .lNET 的目标 - 提供访问数据的标准方法,但可能是 Oracle(如 System i 上的 DB2)有自己的怪癖......但 ConnectionStrings.com 上的信息似乎表明你可以这样做...connectionstrings.com/oracle
  • 请等到稍后再更改它。否则我以后再搜索发给前段时间遇到同样问题的朋友时,我就找不到了。他的解决方案是放弃并使用其他东西。
  • “收藏”,因为坦率地说,让 Oracle 驱动程序连接到 Oracle 数据库是一个巨大的 PITA。
  • @LukePuplett 仅供参考,从 11.2.0.2.5 开始,适用于 VS 的 Oracle 数据访问组件附带一个实体框架提供程序。此外,您可以使用一些愚蠢的语法在您的应用配置中而不是在 TNS_NAMES 中指定连接字符串。它仍然是一个 PITA,但没有那么糟糕。另外,我只是在运行程序的机器上安装了 230 MB 驱动程序,该程序需要与 Oracle 对话以解决 DLL 问题。

标签: c# .net oracle


【解决方案1】:

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

例如configure.bat xxx.netx xxx\product\11.2.0\client_1

【讨论】:

  • 请将此作为评论发表。这不是答案。
【解决方案2】:

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

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

诀窍是……作为开发人员,我们的机器还必须具有 .Net IDE 工具。 Oracle 有一个蹩脚的命名约定,但基本上有两部分: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 年第一季度)将发布他们的下一个 ODP.Net 包...这将是一个完全托管的代码库...意味着不再有单独的客户端或 ODAC 包可以匹配,平台将是不知道 32 位和 64 位的区别……它的功能很像旧的 microsoft 库,只是它将由 oracle 构建和维护,具有更强大的功能集。我只希望它早点到来。

【讨论】:

  • +1 是所有“ODP.Net”的唯一答案!
  • 坏消息——如果您碰巧使用了任何适用于 ASP.Net 的 Oracle 身份验证提供程序(角色、配置文件、成员资格提供程序等),这些提供程序与新的 Oracle 不兼容。 ManagedDataAccess.dll。 Oracle 不知何故“忘记”了这些提供商也需要访问数据库。这些提供程序中提供了数据访问权限,并且经过硬编码以查找较旧的 Oracle.DataAccess.dll(不是“托管”)。因此,这进一步使已经很复杂的版本控制意大利面条复杂化。
【解决方案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 并按照“虚拟注册表项”步骤操作。
  • 打开 regedit 并验证 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

同样,您可能需要重新启动(嘿,这是 Windows)。


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

供参考
如果“虚拟注册表项”步骤的链接失效,这里是 Gadi 的帖子中的文本:

"" 嗨,本,

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

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

要解决这个问题,你有两个选择:

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

  2. 如下定义一个虚拟注册表项 (Z_SSIS):

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

问候,

加迪 ""

【讨论】:

  • 我查看了我的 IISExpress 7.5 进程及其 32 位。甚至没有想到 MS 会在 2012 年发布一个仅限 3​​2 位的应用程序。我正在下载 64 位的 IISExpress 8 beta,并将报告回来。
【解决方案4】:

我认为这不是路径问题。 “试图加载格式不正确的程序。” 这个错误几乎总是意味着您在 .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 客户端包(例如,即使您是 32 位应用程序,您仍然需要 32 位 Oracle 客户端)使用 64 位版本的 Windows)

需要检查的几件事:

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

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

这是我能做的最好的事情,因为我不知道更多关于你的应用的项目设置。

【讨论】:

  • System.Data.OracleClient 不再维护。 .NET 4 仅修复了错误,Microsoft 不会添加新功能,他们建议使用 Oracle ODP.NET 库。
  • 感谢您的来信。我的建议更多是根除平台目标问题。如果 .NET 提供程序正常工作,那么 x86/x64 不匹配很可能在于 OraOps11w.dll,如果他仍然遇到相同的错误,则可能是非托管 Oracle 客户端库与他的应用程序的平台目标不匹配
  • +1 表示架构不匹配。虽然,我在使用 ASP.NET 时遇到了很大的问题,即使将构建设置为 x86。
  • @Jim 有点偏离原始海报的主题,但对于仅 32 位 asp.net 的观点:我们必须专门将所有程序集更改为以 x86 为目标,然后按照此处的步骤操作:technet.microsoft.com/en-us/library/cc737351.aspx
  • 奇怪,我在 Windows 2008 和 Windows 7 中尝试过同样的事情,但它似乎对 ODP.NET 无关紧要。我在 Windows 2003 上为其他应用程序(不使用 Oracle)完成了相同的 technet 技巧,它们运行良好。我认为 Oracle 在加载依赖项时做了一些奇怪的事情。
【解决方案5】:

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


是的,下载和安装过程很荒谬。我通常什至在他们的网站上都找不到合适的客户端下载,而且 Oracle 通用产品安装程序很糟糕。


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


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

【讨论】:

  • 感谢 Rally,我使​​用 DllPath 指向 OraOps11w.dll,但如果你说我可以将它弹出到我的 .NET bin 文件夹中,那么我可能会这样做。
  • 是的,我在部署它时总是将它复制到我的 \bin 文件夹中。奇怪的是,在某些服务器上,它从不关心它是否存在,而在其他服务器上,它会抛出异常并出现某种版本不匹配错误(我忘记了确切的消息)。
猜你喜欢
  • 1970-01-01
  • 2016-06-17
  • 2017-09-04
  • 2013-01-31
  • 2011-01-09
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 2017-06-26
相关资源
最近更新 更多