【问题标题】:Could not load file or assembly 'Oracle.DataAccess, Version=4.112.4.0, Culture=neutral, PublicKeyToken=89b483f429c47342'无法加载文件或程序集“Oracle.DataAccess,版本=4.112.4.0,文化=中性,PublicKeyToken=89b483f429c47342”
【发布时间】:2015-06-02 16:23:08
【问题描述】:

我已经在服务器上安装了oracle 11 g r 2,我下载了ODAC112040Xcopy_64bit并安装了.net组件。

我将存在于该位置Oracle_Folder\odp.net\bin\4 中的Oracle.DataAccess.dll 复制到我的Visual Studio 项目中的bin 文件夹中

当我执行我的代码时,我得到了这个异常:

TestOracleConnection.exe 中出现“System.BadImageFormatException”类型的未处理异常

其他信息:无法加载文件或程序集“Oracle.DataAccess,Version=4.112.4.0,Culture=neutral,PublicKeyToken=89b483f429c47342”或其依赖项之一。试图加载格式不正确的程序。

我的代码是:

public string CallCardDetails(string CallCardNo)
{
    //initialize
    using (DataSet ds = new DataSet())
    {
        //connect
        using (OracleConnection conn = new OracleConnection("User Id=oraDB;Password=ora;Data Source=CCT"))
        {
            // Oracle uses : for parameters, not @
            string query = "SELECT idcard from CallCardTable where idcard= :pCallCardNo";

            // Let the using block dispose of your OracleCommand
            using (OracleCommand cmd = new OracleCommand(query, conn))
            {
                // Note: be careful with AddWithValue: if there's a mismatch between the .NET datatype of
                // CallCardNo and the idcard column you could have an issue.  Cast the value you provide
                // here to whatever is closest to your database type (String for VARCHAR2, DateTime for DATE, Decimal for NUMBER, etc.)
                cmd.Parameters.Add(":pCallCardNo", CallCardNo);
                conn.Open();

                // Again, wrap disposables in a using or use try/catch/finally (using will dispose of things in case of exceptions too)
                using (OracleDataAdapter dA = new OracleDataAdapter(cmd))
                {
                    dA.Fill(ds);

                    return ds.GetXml();
                }
            }
        }
    }
}

【问题讨论】:

  • 你的项目是什么 .net 版本?
  • @SyedOsamaMaruf 它是 4.5 Target Framework 你在找什么?
  • 是的。您发布的文件位置显示您从 Oracle_Folder\odp.net\bin\4 4 版本的 bin 文件夹中获取它。看看 bin\4.5 中是否有你需要的 req dll。
  • @SyedOsamaMaruf,不,只有 24(以及 1.x 直到 Oracle 11.1)。 Target Framework 4.5 的应用程序将使用 4
  • @Wernfried 谢谢。不知道

标签: c# .net oracle


【解决方案1】:

好的,我将根据我对 ODP.NET 的经验提出以下建议:

您的系统正在尝试加载 64 位 Oracle DLL,但由于应用程序在 32 位模式下运行而无法加载。尝试将您的应用程序明确设置为 64 位。或者,安装 32 位 ODP.Net 驱动程序,看看它们是否工作得更好。

【讨论】:

    【解决方案2】:

    前段时间遇到过类似的问题... 参考this这里的问题:

    尝试将您的项目“平台目标”设置为“x86”而不是“任何 CPU”。

    希望这会有所帮助!

    【讨论】:

    • 我这样做了,但我会遇到同样的问题,完全相同的问题
    • x86 应用程序无法加载 64 位 ODP.NET 提供程序(已安装)。
    • 这解决了我正在处理的一个古老应用程序上的一个环境问题。我早该知道!谢谢!
    【解决方案3】:

    我就是这样解决的:

    安装包 ODP.NET4 -Version 4.112.3

    【讨论】:

      【解决方案4】:

      我通常使用用于 ODP.net 的 NuGet 包,它们工作正常。你可以找到他们here

      这就是您构建解决方案所需的全部内容,您无需安装任何驱动程序。

      【讨论】:

        【解决方案5】:

        检查 dll 的目标框架和您的项目是否匹配。您发布的文件位置显示您从 Oracle_Folder\odp.net\bin\4 的 bin 文件夹中获取了 4 版本。看看 bin\4.5 中是否有你需要的 req dll。因为如果您将 dll 添加到目标框架不匹配的项目中,也会发生此异常。
        此外,在将 dll 放入 bin 文件夹之前清理您的解决方案。 :)

        【讨论】:

        • 我将项目框架更改为4,但我仍然遇到完全相同的问题
        • @Marco Dinatsoli 从oracle.com/technetwork/database/windows/downloads/… 下载 ODP.NET_Managed121020.zip - 2.53 MB(2,662,823 字节),然后从那里使用 odp.net/managed/common/Oracle.ManagedDataAccess.dll
        • 也不要手动将dll放入bin中。在你的项目中添加它的 ref 并确保复制本地属性设置为 true。重建项目并运行。
        【解决方案6】:

        要使用 Oracle Data Prover for .NET (ODP.NET) 版本 4.112.4.0 64 位,必须满足以下条件:

        • 目标框架为 4.0 或更高版本
        • 架构必须是 x64AnyCPU(如果是 64 位 Windows,这很可能是这种情况)
        • 64 位 Oracle 客户端 11.2 版已安装在您的 PC 和目标计算机上

        在此分析器中查找更多信息:The provider is not compatible with the version of Oracle client

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-07
          • 1970-01-01
          • 1970-01-01
          • 2015-08-17
          • 2015-04-01
          • 2018-02-05
          • 2021-01-22
          • 2017-11-15
          相关资源
          最近更新 更多