26

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

所以这就是我已经走了多远。

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

ODBC Windows 64-bit Instance Client, 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 并运行了测试——它成功了!

然后,我下载了适用于 .NET 4.0 的最新 ODP.NET 的 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客户端版本不兼容

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

所以我下载了 32 位最新的 11g “Instant Client”,然后把它放在我的 \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: 没有监听器

4

5 回答 5

5

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

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

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

所以……回到 IDE……Vis​​ual 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 构建和维护,具有更强大的功能集。我只希望它早点到来。

于 2012-11-20T00:50:57.740 回答
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 安装的)

我从我的博客文章中逐字复制此内容)

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

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

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


如果您需要执行任何清理工作,我也在博客中对此进行了介绍

供参考
如果“虚拟注册表项”步骤的链接失效,以下是 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 节点并单击 New -> Key。
    • 调用新密钥Z_SSIS(以确保它是最后一个条目)。
    • 右键单击Z_SSIS节点并单击新建 -> 字符串。
    • 命名属性ORACLE_HOME
    • 双击ORACLE_HOME并将其设置为您要使用的 Oracle 32Bit 安装主目录的位置。

问候,

加迪“”

于 2012-07-06T19:06:42.990 回答
1

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

有几件事要检查:

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

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

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

于 2012-07-06T18:47:56.620 回答
1

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


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


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


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

于 2012-07-06T17:20:53.457 回答
-1

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

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

于 2015-02-27T06:23:17.083 回答