【问题标题】:Oracle.DataAccess ErrorOracle.DataAccess 错误
【发布时间】:2012-03-12 20:14:27
【问题描述】:

我有一个在 Windows 环境中运行的 asp.net / C# Web 应用程序。 该项目构建良好,并且在我本地机器的 VB.net 开发服务器上完美运行。

但是,当我发布到真正的应用程序服务器时,我收到以下错误消息:

[OracleException (0x80004005): 提供者与Oracle客户端版本不兼容] [TypeInitializationException: 'Oracle.DataAccess.Client.OracleConnection' 的类型初始化器抛出异常。]

此应用程序的一个版本当前运行良好,我正在不同目录中的实时服务器上进行测试。我什至尝试从工作应用程序中获取 Oracle.DataAccess .dll,但仍然收到相同的错误消息。

【问题讨论】:

  • 我在某个论坛上读到,我可以将我的 web.config 文件指向一组 oracle 即时客户端 .dll。我不确定这是否值得。
  • 另外,我正在寻找 oracle.dataaccess 版本 2.112.2.0,它是安装在实时服务器的 GAC 上的版本。
  • Oracle 客户端程序集版本可以在 machine.config 中设置。你可以检查一下。

标签: c# asp.net oracle dll


【解决方案1】:

首先:Oracle 客户端/提供程序一团糟。这适用于 MS (无论如何都已折旧)和 Oracle 。

为了通过 ODP.NET 提供程序连接到 Oracle DB,需要正确设置三件事:

  • Oracle 客户端需要正确设置(与 .NET 提供者无关,这里指的是通常在 c:\oracle 中安装的 oracle 客户端)
  • ODP.NET 提供程序需要与已安装的 Oracle 客户端兼容
  • 客户端和提供程序的架构需要与您的应用程序匹配,您不能将 64 位客户端与 x86 提供程序/应用程序一起使用,反之亦然

通常最好的办法是同时拥有两者的最新版本。但是,如果您想一劳永逸地摆脱这个问题,请使用第三方 oracle .NET 提供商。

更新

其中一个更好的是来自 DataDirect(无从属关系):
http://www.datadirect.com/products/net/net-for-oracle/index.html

这不仅仅是安装(不需要 oracle 客户端),而且速度更快、完全托管、x64 和一般支持比您使用 ODP.NET 获得的更好。不过这会花费你。

DevArt 也相当不错(而且便宜得多):
http://www.devart.com/dotconnect/oracle/

出于可扩展性的原因,我们决定使用 DataDirect,但这与您无关。

在这里您可以找到构建 .NET 提供程序的第三方的优秀汇编,但不限于 oracle:
http://msdn.microsoft.com/en-us/data/dd363565

【讨论】:

  • 用 2 个样本和一个通用链接更新了我的答案。
【解决方案2】:

我之前也遇到过同样的场景

阅读本文可能对您有所帮助ODAC Oracle for .NET

关于您的服务器中的问题,您必须从 oracle 安装整个 ODAC 客户端

现在最新版本是4.xx

我已经安装了它,一切都像魅力一样工作

希望这会有所帮助:)

保重

【讨论】:

  • 你不必安装整个东西。如果您只安装必要的文件,您可以将内存占用保持在 140 MB 左右。
【解决方案3】:

我可以通过在 prod 服务器上搜索 Oracle.DataAccess.dll 来解决这个问题。 因此,我没有尝试使用我的开发环境中的 Oracle.DataAccess.dll 构建/部署项目,而是从 prod 服务器 oracle 客户端目录中复制了 .dll 并将其作为参考。我还设置了 .dll 属性“Copy Local = true”和“Specific Version”= true。所以看起来我的开发服务器和产品服务器上的 oracle 客户端版本不匹配。

【讨论】:

    【解决方案4】:
    Equals, with Oracle.DataAccess.dll    Works!!!!
    //using Oracle.DataAccess.Client
    
    object pdf = null;
    
    var queryString =@"SELECT PDF  FROM DIGITAL  WHERE ID_DIGITAL=1001" ;  //example
    var ctx = new Entities();
    var entityConn = ctx.Connection as EntityConnection;
    
    if (entityConn != null)
    {
    var dbConn = entityConn.StoreConnection as OracleConnection;
    dbConn.Open();
    
    var cmd = new OracleCommand(queryString, dbConn);
    using (var reader = cmd.ExecuteReader())
    {
    while (reader.Read())
    {
    pdf = reader[0];
    }
    }
    dbConn.Close();
    }
    return pdf;
    

    【讨论】:

      【解决方案5】:

      除了其他建议之外,只需尝试以管理员身份运行 Visual Studio。

      我花了很多时间弄乱 GAC 和各种版本的 Oracle.DataAccess.dll,最后只是以管理员身份运行 VS 让它运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-28
        • 1970-01-01
        • 1970-01-01
        • 2013-02-23
        • 1970-01-01
        • 1970-01-01
        • 2016-05-15
        • 2018-09-16
        相关资源
        最近更新 更多