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

我试图在我的 ASP.net 项目中使用 NET 11g (11.1.0.6.20)即时客户端作为 资料提供者,但是当我运行 aspx 页面时,我得到了一个“ 提供程序与 Oracle 客户端的版本不兼容”错误消息。如果你能帮忙,我将不胜感激。

我在 VisualStudio2005中引用了数据提供程序,其后面的代码如下所示:

using Oracle.DataAccess.Client;
..


OracleConnection oOracleConn = new OracleConnection();
oOracleConn.ConnectionString =
"Data Source=MyOracleServerName;" +
"Integrated Security=SSPI";
oOracleConn.Open();


//Do Something


oOracleConn.Close();

该页面的错误如下:

Exception Details: Oracle.DataAccess.Client.OracleException: The provider is not compatible with the version of Oracle client


Source Error:
Line 21:
Line 22:
Line 23:             OracleConnection oOracleConn = new OracleConnection();
Line 24:             oOracleConn.ConnectionString =
Line 25:                 "Data Source=MyOracleServerName;" +


[OracleException (0x80004005): The provider is not compatible with the version of Oracle client]
Oracle.DataAccess.Client.OracleInit.Initialize() +494
Oracle.DataAccess.Client.OracleConnection..cctor() +483


Stack Trace:
[TypeInitializationException: The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception.]
Oracle.DataAccess.Client.OracleConnection..ctor() +0
Boeing.IVX.Web.RoyTesting.Page_Load(Object sender, EventArgs e) in C:\Documents and Settings\CE218C\Desktop\IVX.Net\Web\IVX\RoyTesting.aspx.cs:23
System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +33
System.Web.UI.Control.OnLoad(EventArgs e) +99
System.Web.UI.Control.LoadRecursive() +47
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1436
379945 次浏览

IIS/IWAM 用户是否拥有 Oracle 目录的权限?您能否使用其他应用程序(如 Excel 或 Access)连接到此数据源?

在我看来,虽然您使用的是 Oracle 即时客户端的 ODP,但是 ODP 可能试图使用实际的 Oracle 客户端。机器上是否也安装了标准的 Oracle 客户端?我记得 Oracle 对同一台机器上的多个客户端非常挑剔。

我只安装了 用于.NET 2.0的 Oracle 数据提供程序(11.1.0.6.20),我没有安装 Oracle 即时客户端(11.1.0.6.0)

我刚刚安装了它,错误消失了!

这可能是由于运行64位引起的。NET 运行时对32位 Oracle 客户端的访问。如果您的服务器上运行的是64位的应用程序,就会出现这种情况。它将运行。NET 应用程序的64位运行时。您可以在 VS 中将项目上的 CPU 标志设置为在32位运行时中运行。

我也有同样的问题。在编译应用程序之后,我删除了 oraociei11.dll (并且忘记了我已经删除了它)。它在尝试执行的时候出现了这个错误。所以当它找不到 oraociei11.dll 的 dll 时,就会显示这个错误。也许在其他情况下会出现这种错误,但这似乎是其中之一。

我一直在进一步研究这个问题,您只需要从相同的下载版本的 ODP.Net 中获取所有适当的 DLL,并将它们放在与您的 Exe 文件相同的文件夹中,因为 ODP.Net 对于不混合版本号非常挑剔。

我已经在这里解释了如何做到这一点: < a href = “ http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c”rel = “ norefrer”> http://splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c 不过要点是这样的:

  • 下载 ODP.Net
  • 解压文件
  • 解开里面所有的罐子
  • 拿上这些刚解开的 DLL:
    • Dll (重命名为‘ oci.dll.dbl’)
    • Oracle. DataAccess.dll
    • (口语)
    • OraOps11w.dll
    • Orannzsbb11.dll
    • Oraocci11.dll
    • Ociw32.dll (重命名为‘ ociw32.dll.dbl’)
  • 将所有的 DLL 放在与 C # 可执行文件相同的文件夹中

在目标机器上安装 ODP.Net,它应该可以解决这个问题... 复制 dll 的看起来不是一个好主意..。

对于 Oracle 11g (11.1.0.7.20) ,我必须添加以下 dls 和我的 Exe 才能工作。

  1. Oci.dll
  2. OraOps11w.dll
  3. Oraociicus11.dll (非常大,接近30mb)
  4. Oracle. DataAccess.dll

另外寻找 IIS 应用程序池启用32位真或假标志,当你看到这个消息,一些甲骨文论坛指示我这一点!

我们也有同样的问题,因为先知。网络共享上的 Data.dll 程序集由我们的 DBA 更新。从项目中删除引用并再次添加它解决了问题。

我有同样的问题,但在我的情况下,我不能只是复制 dls 到 bin 文件夹,然后我只’重新绑定’汇编版本。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89B483F429C47342" culture="neutral"/>
<bindingRedirect oldVersion="2.112.2.0" newVersion="2.112.1.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
  • 在64位机器上,将“ msvcr71.dll”从 C: Windows SysWOW64复制到 应用程序的 bin 目录。
  • 在32位机器上,将“ msvcr71.dll”从 C: Windows System32复制到 应用程序的 bin 目录。

Http://randomdevtips.blogspot.com/2012/06/provider-is-not-compatible-with-version.html

解决这个问题只需要两步。

  1. 进入应用程序池的提前设置,并将“启用32位应用程序”标志设置为 True。
  2. 确保所有的 DLL 在您的斌是32位版本现在..。

祝你好运。

最近,我不得不处理一个较老的项目,其中解决方案和所有包含的项目都是针对 x32平台的。我一直试图模仿甲骨文。Dll 和其他所有地方推荐的 Oracle 文件,但每次都碰壁。最后,灯泡在头部亮起(8小时后:) ,并要求检查安装的 ODAC 程序集和他们的平台。我已经安装了所有64位(x64) ODAC 客户机,但没有安装32位(x32)的客户机。安装了32位 ODAC,问题就消失了。

如何检查已安装的 ODAC 的版本: 查看文件夹 C: Windows 程序集。“ Processor Architecture”属性将通知平台已安装的 ODAC。

八个小时对灯泡来说是很长的一段时间。难怪我工作总是很辛苦:)。

以下是我为解决这个持续了3个小时的问题所做的工作:

  1. 在 Oracle 主页的 C:\oracle\product\11.2.0中,我有一个名为 client_1的文件夹,我之前在这个文件夹中为 Windows 64位安装了 ODP.NET位。

  2. 后来,在尝试用 Visual Studio 2012调试我的 ASP.NET Web API 应用程序时,我不断收到这个错误消息: 提供程序与 Oracle 客户端的版本不兼容

  3. 在谷歌搜索中我发现这是因为我使用的是 ODP.NET64位。然后我抓起 ODP.NET的 Windows 32位和安装它,但我一直得到相同的错误消息。

  4. 解决方案: 删除文件夹 client_1并重新安装 ODP.NET32位。在某种程度上,安装程序混合了64位版本和32位版本。想想看..。

  5. 现在我又高兴了,我可以开一个新的 OracleConnection

经过几个小时的故障排除,我发现这个问题是由 Oracle 引起的。Dll (v4.0) ,但是运行时也加载 Oracle。来自 GAC 的 DataAccess.dll (v2.x)。移除并读取神谕。项目引用中的 DataAccess 条目为我解决了这个问题。

在我的情况下,这里提到的其他文件似乎没有必要。

更新

“提供程序与 Oracle 客户端版本不兼容”错误的根本原因(通常)是托管程序集试图加载与版本不匹配的非托管库。似乎可以通过在 web.config< sup > 1 中指定库路径来强制 Oracle 驱动程序使用正确的库

<configuration>
<oracle.dataaccess.client>
<settings>
<add name="DllPath" value="C:\oracle\bin"/>
<!-- ... -->
</settings>
</oracle.dataaccess.client>
</configuration>

对于初学者,您应该“忽略”这里的所有 x86/x64对话,而是尝试 ODP.NET ManagedDriver (如果您正在使用。网络 v4 +) :

Https://www.nuget.org/packages/oracle 管理/数据访问/

Https://www.nuget.org/packages/oracle 管理/数据访问

Net 托管与非托管驱动程序

避免所有“非托管”什么 DLL 什么体系结构问题! : D (关于时间 Oracle)。

NuGet 软件包(同样适用于11g) :

enter image description here

旧方法/手工方法:

有关如何转换为使用 管理库的信息:

  • 首先,这里是 管理无人管理: http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148的一个很好的代码比较
  • 确保已下载 NET,托管驱动程序 Xcopy 版本
  • 从下载的 zip 文件,复制并粘贴到您的项目目录:
    • ManagedDataAccessDTC.dll
    • Oracle. ManagedDataAccess.dll
  • 添加对 Oracle. ManagedDataAccess.dll的引用
  • 确保使用两个 dll 释放 exe (在 VS2010中添加到 申请文件夹)

Chris 的解决方案对我也很有效,但是我收到了一条错误消息:

Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. An attempt was made to load a program with an incorrect format.

显然,在 Oraclish 的外语中,这意味着您的程序要么针对所有平台,要么针对32位机器。 只需将 ProjectProperties 中的目标平台更改为64位,然后期待最好的结果。

对于仍然有这个问题的任何人: 基于本文

Http://oradim.blogspot.com/2009/09/odpnet-provider-is-not-compatible-with.html

我发现我的服务器缺少 Microsoft C + + Visual Runtime Library ——因为安装了 Visual Studio,所以我把它放在了我的开发计算机上。我从这里下载并安装了这个库的最新版本:

Http://www.microsoft.com/en-us/download/details.aspx?id=13523

运行了设置,并且从 C # 进行了 Oracle 调用!

我们来总结一下:

错误消息 “提供程序与 Oracle 客户端版本不兼容”可能由几个原因引起。

  • 您没有安装 Oracle 客户端。在这种情况下,错误消息确实是误导性的。

    Oracle 数据提供程序。NET (ODP.NET,即文件 Oracle.DataAccess.dll)不包含在 Oracle 即时客户端中,它必须单独安装(从 32位 Oracle 数据访问组件(ODAC)64位 Oracle 数据访问组件(ODAC)下载下载) ,或者你必须在 Oracle 通用安装程序(OUI)中选择相应的选项。

    注意,当安装 Oracle Data Provider > = 12.1时,该提供程序不会自动注册到 GAC 中。如果需要,您必须手动注册它,请参阅 Oracle Doc 2272241.1

  • NET 的版本与已安装的 Oracle 客户端版本不匹配。你甚至要检查次要版本号!例如,Oracle.DataAccess.dll版本 4.112.3.0与 Oracle 客户端 11.2.0.4不兼容。仔细检查 OP.NET 和 Oracle 客户端的版本。您可以在 oraociei*.dll和/或 OraOps*w.dll上使用 Sigcheck来获得 Oracle 客户端的版本。

    注意不同的编号。

    有 ODP.NET 版本的“1.x”、“2.x”和“4.x”。这些数字与微软有关。NET Framework 版本1.0.3705/1.1.4322、2.0.50727和4.0.30319。在 Oracle 客户端11.1之前,“1.x”版本是可用的。“4.x”版本是在 Oracle Client 11.2中引入的

  • NET 的体系结构(32位或64位)与您的应用程序体系结构不匹配。32位应用程序只能与32位 Oracle Client/ODP.NET 分别工作,64位应用程序需要64位 Oracle Client/ODP.NET。(除非你使用 NET 托管驱动程序)

  • 那个。NETFramework 版本不匹配。例如,如果使用 Target 编译应用程序。NET Framework 2.0,则不能使用 ODP.NET version 4.x。那个。NET Framework 目标版本必须等于或高于 ODP.NET 版本。

  • 开发计算机上的 Oracle.DataAccess.dll版本(即编译时加载的版本)高于目标计算机上的版本。

  • 请注意,Oracle.DataAccess.dll可能是从 GAC加载的,在默认情况下,GAC优先于任何本地提供的文件。

解决方案

  • 考虑使用 ODP.NET ManagedDriver,它可以从 Oracle 页面 64位 Oracle 数据访问组件(ODAC)下载下载。 在这里,您只需要将 Oracle.ManagedDataAccess.dll文件复制到应用程序目录,不需要其他任何东西。它适用于32位和64位。

  • 在你的 *.csproj中,*.vbproj编辑你对 ODP.NET 的引用,如下所示:

    <Reference Include="Oracle.DataAccess">
    <SpecificVersion>False</SpecificVersion>
    <Private>False</Private>
    </Reference>
    

    不需要像 Version=...processorArchitecture=...这样的属性。根据所选的架构和目标,应用程序将加载正确的 Oracle.DataAccess.dll。NET 框架(如果安装正确的话) - > 未经100% 核实

  • 如果您不知道目标机器上 Oracle Client 的版本(例如,它可能是您的客户的机器) ,请转到上面提到的下载页面,并下载 Oracle 数据访问组件的最少 收到版本。提取 zip 并将 Oracle.DataAccess.dll文件复制到本地计算机。在 VS 项目中引用这个(很可能已经过时) DLL。此 DLL 的版本是应用程序将使用的 ODP.NET 的最小版本。运行应用程序时,GAC 中的发布服务器策略将重定向到实际安装的版本。

  • 我不认为这是一个明智的做法,采取单一的 DLL 的,并复制到某些文件夹。它可以在“裸”机器上工作,但是如果您的目标机器已经安装了任何 Oracle 产品,则存在很高的版本不匹配风险。从您的机器上卸载任何 Oracle 产品并重新安装。看看 如何卸载/完全删除 Oracle 11g (客户端) ?它订购得到一个真正干净的机器。

  • 如果您必须同时使用32位和64位应用程序,请按照下面的说明在一台机器上同时安装这两个版本:

假设: Oracle Home 称为 OraClient11g_home1,客户端版本为11gR2。

  • 可选地删除任何已安装的 Oracle 客户端

  • 下载并安装 Oraclex86Client,例如,到 C:\Oracle\11.2\Client_x86

  • 将 Oraclex64Client 下载并安装到不同的文件夹中,例如 C:\Oracle\11.2\Client_x64

  • 打开命令行工具,转到文件夹% WINDIR% System32,通常是 C:\Windows\System32,并创建一个符号链接 ora112到文件夹 C:\Oracle\11.2\Client_x64(见下文)

  • 更改为文件夹% WINDIR% SysWOW64,通常为 C:\Windows\SysWOW64,并创建一个到文件夹 C:\Oracle\11.2\Client_x86的符号链接 ora112(见下文)

  • 修改 PATH环境变量,将所有条目(如 C:\Oracle\11.2\Client_x86C:\Oracle\11.2\Client_x64)分别替换为 C:\Windows\System32\ora112和它们各自的 \bin子文件夹。注意: C:\Windows\SysWOW64\ora112不能在 PATH 环境中。

  • 如有需要,把你的环境变量设定为 C:\Windows\System32\ora112

  • 打开注册表编辑器。将注册表值 HKLM\Software\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME设置为 C:\Windows\System32\ora112

  • 将注册表值 HKLM\Software\Wow6432Node\ORACLE\KEY_OraClient11g_home1\ORACLE_HOME设置为 C:\Windows\System32\ora112(而不是 C:\Windows\SysWOW64\ora112)

  • 你完蛋了!现在您可以无缝地使用 x86和 x64 Oracle 客户机,也就是说,一个 x86应用程序将加载 x86库,一个 x64应用程序将加载 x64库,而不需要对系统进行任何进一步的修改。

创建符号链接的命令:

cd C:\Windows\System32
mklink /d ora112 C:\Oracle\11.2\Client_x64
cd C:\Windows\SysWOW64
mklink /d ora112 C:\Oracle\11.2\Client_x86

一些注意事项:

  • 两个符号链接必须具有相同的名称,例如 ora112

  • 如果以后要手动安装 ODP.NET,请注意选择适当的安装文件夹。

  • 尽管名称文件夹 C:\Windows\System32包含 x64库,而 C:\Windows\SysWOW64包含 x86(32位)库。

  • 也许设置你的环境变量是一个明智的选择。注册表中的 TNS_ADMIN条目)到一个公共位置,例如 TNS_ADMIN=C:\Oracle\Common\network

我没有走上获得新 DLL 的道路。我们有一大堆现有的项目,工作非常好,只是我的新项目让我头疼,所以我决定尝试其他的东西。

我的项目使用了一个内部开发的依赖于 Oracle 的 Internal.dll。Dll v4.112.3.0.由于某种原因,在发布时,VisualStudio 总是上载 v4.121.0.0,即使它没有在任何配置文件中显式指定。所以我才会出错。

所以我就这么做了:

  1. 将 Internal.dll 从一个成功运行的项目复制到我的网站的 /bin(只是为了安全起见)。
  2. 将 Oracle.DataAccess.dll 从一个成功运行的项目复制到我的网站的 /bin
  3. 从我的网站添加两者的参考。
  4. 最后,在 myWebSite.csproj中出现了 Oracle.DataAccess 引用,但它显示了错误的版本: v4.121.0.0而不是 v4.112.3.0
  5. 我手动更改了 myWebSite.csproj中的引用,因此它现在是:

    <Reference Include="Oracle.DataAccess, Version=4.112.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>bin\Oracle.DataAccess.dll</HintPath>
    </Reference>
    

我和甲骨文也有同样的问题。Dll v4.121.2.0.具有2个家庭安装(32和64位版本)。32位版本的 worker,64位版本没有。

在我的情况下(经过2天的尝试) ,我发现问题是64位家庭版本的权限。该版本中的 许多目录具有独占覆盖的权限,其中“ Authenticated Users”角色没有“ Read”访问权限,这是在父目录上默认设置的。这些子目录包括“ bin”、“ network/admin”、“ nls”、“ oracore”、“ RDBMS”以及其他可能的子目录。我是通过从系统内部过滤掉“ Process Monitor”(Procmon.exe)实用程序中的“ ACCESS DENIED”结果来找到它们的。一旦权限从父目录继承到这些子目录,一切就开始工作了。

我没有覆盖整个 Oracle 主目录的权限,所以我一次只覆盖一个目录,但是我想如果你不太担心安全问题,你可以在整个相应的 Oracle 主目录中重置它。

在我为 VisualStudio2015安装 Oracle 数据工具之后,我遇到了这个问题,然后与 Oracle 进行了一个小时的斗争。我决定再次尝试重新安装 Oracle 客户端,而不是这种文件复制、配置更改等等的乱七八糟的工作,这对我来说很有效。

TLDR 版本:

  • 使用12c 100% 托管提供程序代替。
  • 如果必须使用旧的提供程序,则需要指向 Oracle。Dll 转换为正确版本的非托管 Oracle Client Dll。如果您的机器上安装了多个 Oracle 客户端,可能只需要在应用程序配置中包含“ DllPath”配置变量(见下文) ,但您可能还需要安装一个新的 Oracle 客户端来指向。

完整版:

首先,让我们确保理解旧的非托管提供程序(而不是新的12c 100% 托管提供程序)的组件。它由两部分组成:

  1. 托管的. net 组件-Oracle. DataAccess.dll
  2. 非托管(non-.net)客户端

简单地说,Oracle.DataAccess.dll 几乎只是一个包装器,它将. net 指令转换为非托管客户机的 ORACLE-NET 指令。

也就是说,当你加载 Oracle 的时候。DataAccess 尝试定位所需的非托管客户端 dls 的顺序。来自 Oracle 文档:

Dll 搜索依赖的非托管 DLL (如 基于以下顺序:

1. 应用程序或可执行文件的目录。

2. 应用程序配置或 web.config 指定的 DllPath 设置。

3. machine.config 指定的 DllPath 设置。

4. Windows 注册表指定的 DllPath 设置。

软件 Oracle ODP.NET 版本 DllPath

5. Windows PATH 环境变量指定的目录。

因此,在您的情况下,您的应用程序遵循上述过程,并找到了一个路径,其中包含与 Oracle 相关的过于陈旧的无管理 dls。正在使用的 DataAccess.dll 程序集。

可能只是那台机器上唯一安装的 Oracle 客户端太旧了。但是,如果您在机器上安装了多个客户机,并且首先在不同但较旧的安装中找到了非托管文件,那么就会出现这种情况。如果是后者,简单的做法是在配置中使用 dllPath 配置变量,并将其指向正确的 Oracle Home Bin 文件夹:

<configuration>
<oracle.dataaccess.client>
<add key="DllPath" value="c:\oracle\product\1.1.0-xcopy-dep\BIN"/>
</oracle.dataaccess.client>
</configuration>

如果希望安装新的客户端副本,则 Xcopy 版本是最小的,包含“即时客户端”,并将上面的 DllPath 指向这个新位置。但是任何 Oracle 客户端安装都可以工作。

但是,如果你想避免所有这些非托管客户端解析的东西,看看你是否可以更新你的应用程序,使用100% 托管提供商而不是-它真的只是一个或两个托管程序集,没有任何依赖于非托管文件。

也有可能您没有加载 Oracle。如果 DataAccess.dll 同时安装在 bin 目录和 GAC 中,那么它就是您认为的那样,但我认为这种情况不太可能发生。有关更多信息,请参见 装配分解过程装配分解过程

这里有很多理论上的答案,但是这里有一个可以立即复制、粘贴和测试代码的工作示例:

  1. 我安装了 Oracle Express 数据库 OracleXE112,它已经预装了一些演示表。
  2. 当您启动安装程序时,您会被要求输入一个 密码。我输入“ xxx”作为密码。(生产中未使用)
  3. 我的服务器在机器 192.168.1.158上运行
  4. 在服务器上,必须显式允许访问 Windows防火墙中的进程 TNSLSNR.exe。此进程侦听端口1521。如果您从下面的代码中得到一个超时错误,请检查您的防火墙。
  5. 选项 A: For C # (。NET2或。NET4)你可以下载 ODAC11,你必须从中添加 Oracle。将 DataAccess.dll 添加到项目。此外,这个 DLL 依赖于: OraOps11w.DLL、 oci.DLL、 oraociei11.DLL (130MB!)Msvcr80.dll. 这些 DLL 必须与 EXE 在同一目录中,或者必须在 HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.112.4.0\DllPath中指定 DLL 路径。在64位机器上额外写入 HKLM\SOFTWARE\Wow6432Node\Oracle\...
  6. 选项 B: 如果您已经下载了 ODAC12,那么您需要 Oracle。DataAccess.dll,OraOps12w.dll,oci.dll,oraociei12.dll (160MB!)口号,口号,口号。注册表路径是 HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\ODP.NET\4.121.2.0\DllPath
  7. 选项 C: 如果你不想要超过100MB 的大型 DLL,你应该下载 ODP.NET _ Managed12.x.x.xxxxxx.zip,其中你会发现 Oracle.ManagedDataAccess.dll只有4MB,是一个纯托管 DLL,它可以在32位和64位进程中工作,不依赖于其他 DLL,也不需要任何注册表项。
  8. 下面的 C # 代码适用于服务器端的 没有任何配置(只是默认安装) :
using Oracle.DataAccess.Client;
or
using Oracle.ManagedDataAccess.Client;


....


string oradb = "Data Source=(DESCRIPTION="
+ "(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.158)(PORT=1521)))"
+ "(CONNECT_DATA=(SERVER=DEDICATED)));"
+ "User Id=SYSTEM;Password=xxx;";


using (OracleConnection conn = new OracleConnection(oradb))
{
conn.Open();
using (OracleCommand cmd = new OracleCommand())
{
cmd.Connection  = conn;
cmd.CommandText = "select TABLESPACE_NAME from DBA_DATA_FILES";


using (OracleDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
listBox.Items.Add(dr["TABLESPACE_NAME"]);
}
}
}
}

我遇到过类似的问题,根本原因是 GAC 有两个 oracle.dataaccess 版本,即 v4.0 _ 4.112.2.0和 v4.0 _ 4.112.4.0。我的应用程序引用的是 v4.0 _ 4.112.2.0,所以当我从 GAC 中删除 v4.0 _ 4.112.4.0时,它工作得很好。

GAC 路径: C: Windows Microsoft.NET 程序集 GAC _ 64 Oracle. DataAccess

以前: enter image description here

之后: enter image description here

要删除版本,只需从 GAC 中删除相应的文件夹即可。

如果您有多个 Oracle 客户端,或者有时引用不同的版本,那么在使用非托管 Oracle 引用时可能会发生此问题
有两种方法可以解决这个问题:

  1. 第一个快速的解决方案是删除非托管引用并使用来自 NuGet 的托管引用。请看下面的选项 < a href = “ https://docs.oracle.com/database/121/ODPNT/intro004.htm # ODPNT8146”rel = “ nofollow noReferrer”> ODP.NET 托管驱动程序和非托管驱动程序之间的区别

  2. 第二个解决方案是修复项目非托管目标版本,如下所示:

  • 首先检查 Oracle 项目引用版本(来自项目引用/(依赖项 > 程序集) > Oracle. DataAccess 右键单击 > 属性) :

    enter image description here< br/>
    enter image description here

然后检查 Oracle GAC 版本

  • 从 run (Win + R)“% windir% Microsoft.NET 汇编”到 gac
    enter image description here

  • 检查与您的项目平台 < br/> 匹配的平台
    enter image description here

  • 检查您的目标平台(右键单击您的项目 > properties) < br/>
    enter image description here

  • 从 gac 文件夹搜索到 Oracle。DataAccess < br/> < br/> < a href = “ https://i.stack.imgur.com/Y9Dv2.png”rel = “ nofollow noReferrer”> < img src = “ https://i.stack.imgur.com/Y9Dv2.png”alt = “ enter image description here”/>

  • 右击 Oracle。DataAccess > properties > Details and check version < br/> < br/> < a href = “ https://i.stack.imgur.com/YSvcU.png”rel = “ nofollow noReferrer”> < img src = “ https://i.stack.imgur.com/YSvcU.png”alt = “ enter image description here”/>

  • 如果您注意到版本不同,这是一个问题,并解决它,我们需要重定向汇编版本(在启动项目去配置文件,并添加以下部分)

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="4.121.2.0" />
</dependentAssembly>
</assemblyBinding>


像这样 enter image description here

OldVersion: 应该覆盖您的项目版本 新版本: GAC 版本 PublicKeyToken: 来自 GAC

enter image description here