【问题标题】:The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception“Oracle.DataAccess.Client.OracleConnection”的类型初始化程序引发异常
【发布时间】:2009-05-27 06:42:56
【问题描述】:

我开发了一个使用 Oracle Data Provider for .NET 的应用程序。我将应用程序文件 (.exe) 和 ODP 库 (Oracle.DataAccess.dll) 复制到另一台未安装 Oracle 客户端和 ODP.NET 的计算机上。当我运行应用程序时,我收到错误消息:“Oracle.DataAccess.Client.OracleConnection”的类型初始化程序引发了异常。

*****************Exception Text***************
System.TypeInitializationException: The type initlializer for 'Oracle.DataAccess.Client.OracleConnection at Oracle.DataAccess.Client.OracleConnection..cctor()
  --- End of inner exception stack trace ---
  at Oracle.DataAccess.Client.OracleConnection..ctor(String connectionString)
  ...

我是否必须在要运行我的应用程序的计算机上安装 ODP.NET 和 Oracle 客户端?如果是,是否有其他方式我不必安装它们但仍可以运行我的应用程序?

谢谢

【问题讨论】:

    标签: odp.net oracleclient


    【解决方案1】:

    Oracle Data Provider for .NET(来自 Oracle)和.NET Framework Data Provider for Oracle(来自 Microsoft)都需要在计算机上安装 Oracle 客户端。

    【讨论】:

      【解决方案2】:

      最简单的方法!!!

      1. 右键单击项目并选择“Manage NuGet Packages...
      2. 搜索 Oracle.ManagedDataAccess。安装它。

      如果您使用 Entity Framework 并且您的 Visual Studio 版本是 2012 或更高版本,那么

      1. 再次搜索 Oracle.ManagedDataAccess.EntityFramework。 安装它。
      2. 在 .cs 文件中使用以下名称空间:
        使用 Oracle.ManagedDataAccess.Client;
        使用 Oracle.ManagedDataAccess.EntityFramework;

      完成。现在重新启动您的 Visual Studio 并构建您的代码。

      这些包有什么作用?
      安装这些软件包后,无需安装额外的 Oracle 客户端软件即可连接到数据库。

      【讨论】:

        【解决方案3】:

        两种选择:

        • 在您要运行程序的 PC 上安装 Oracle 客户端

        • 使用 Oracle.ManagedDataAccess.dll

        您可以在 NuGet 上获得它(搜索“oracle managed”)或下载ODP.NET_Managed.zip(链接是测试版,但指向正确的方向)

        我使用它是为了让我部署到的计算机不需要安装 Oracle 客户端。

        注意在我看来,这对于控制台应用程序来说是件好事,但如果您打算安装您的应用程序,这会很烦人,所以我会在这种情况下安装客户端。

        【讨论】:

          【解决方案4】:

          好的,当您确定使用相同流程的其他应用程序有效时;在您的新应用程序上确保您拥有数据访问参考和三个 dll 文件...

          我从 Oracle 网站下载了 ODAC1120320Xcopy_32bit

          http://www.oracle.com/technetwork/database/windows/downloads/utilsoft-087491.html

          参考:Oracle.DataAccess.dll(ODAC1120320Xcopy_32bit\odp.net4\odp.net\bin\4\Oracle.DataAccess.dll)

          在您的项目中包含这 3 个文件:

          • oci.dll (ODAC1120320Xcopy_32bit\instantclient_11_2\oci.dll)
          • oraociei11.dll (ODAC1120320Xcopy_32bit\instantclient_11_2\oraociei11.dll)
          • OraOps11w.dll (ODAC1120320Xcopy_32bit\odp.net4\bin\OraOps11w.dll)

          当我尝试使用正确的引用和文件创建另一个应用程序时,我会收到该错误消息。

          修复:突出显示所有三个文件并选择“复制到输出”= 如果较新则复制。如果更新,我确实复制了,因为其中一个 dll 超过 100MB,并且我所做的任何更新都不会再次复制这些文件。

          我也遇到了注册表错误,这解决了它。

          public void updateRegistryForOracleNLS()
          {
              RegistryKey oracle = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\ORACLE");
              oracle.SetValue("NLS_LANG", "AMERICAN_AMERICA.WE8MSWIN1252");
          }
          

          有关 Oracle nls_lang 列表,请参阅此站点:https://docs.oracle.com/html/B13804_02/gblsupp.htm

          之后,一切顺利。

          希望对你有帮助。

          【讨论】:

            【解决方案5】:

            您需要安装 oracle 客户端驱动程序才能使这些类正常工作。

            可能有可以处理 Oracle 的 3rd 方连接框架,也许其他人可能知道一些特定的框架。

            【讨论】:

            • 请注意,如果您只安装了 32 位 oracle 客户端,在 64 位机器上也会出现此错误。
            【解决方案6】:

            您需要一个 Oracle 客户端:(2016 年之前)http://www.oracle.com/technology/oramag/oracle/08-nov/o68odpnet.html

            (大约 2019 年)重命名为“Oracle Instant Client”https://www.oracle.com/database/technologies/instant-client/downloads.html

            【讨论】:

            • 嗨@tuinstoel,请注意您在上面提供的链接现已失效。
            • 在断开的链接下方添加了较新的链接(供参考)
            【解决方案7】:

            这是一个古老但仍然相关的问题,虽然这里的答案很有帮助,但没有一个答案可以完全解决 OP 的两个问题。

            1.我是否必须在要运行我的应用程序的计算机上安装 ODP.NET 和 Oracle 客户端?

            - 如果您使用的是 ODP.NET,则为非托管。这是您在 Oracle 客户端安装程序中选择“Oracle Data Provider for .NET”时通常安装的版本(例如)。你从甲骨文下载这个(只是谷歌它:甲骨文网址经常变化)。

            但是,如果您使用的是 ODP.NET,托管(并且您可能希望使用这个)那么不,您只需要安装(或部署)ODP.NET,托管应用程序,而不是完整的 Oracle客户。详情见下文。

            2。如果是,是否有其他方式我不必安装它们但仍然可以运行我的应用程序?

            是的,至少有一种方法。它是ODP.NET的托管端口。

            不幸的是,通常的解决方法,包括 ODBC,Microsoft 的 Oracle Provider for .NET(是的,那个旧的,已弃用的)和 ODP.NET,非托管 DLL 都需要安装 Oracle 客户端。直到我们在 Oracle 的朋友给了我们一个很好的小 (~5MB) DLL,它也是托管的。这意味着不再需要为 32 位和 64 位 Oracle 客户端部署 32 位和 64 位版本!并且在您针对 10.0.2.1(或其他)构建的程序集绑定方面没有更多问题,但是您的客户安装了从 9i 一直到 12c 的一系列客户端,包括中间的“g”客户端),因为您可以发送它使用您的应用,并通过 nuget 对其进行管理。

            但是,如果您使用 ODP.NET, Managed,它作为 nuget 包提供,那么您不需要安装 Oracle 客户端。您只需要 ODP.NET, Managed DLL。如果您之前使用的是 ODP.NET、非托管 DLL,则切换非常容易:只需更改对托管 ODP.NET 的所有引用(csharp 中的 .csproj 文件等),然后更改任何 using语句,例如:using Oracle.DataAccess.Client 变为 using Oracle.ManagedDataAccess.Client 就是这样! (除非您应该在 ODP.NET 中公开的完整客户端中使用一些更高级的数据库管理功能,非托管,我自己没有做过,所以祝你好运..)。并且还从你的app.config/web.config 文件中删除所有那些烦人的assemblyBindingRedirect 节点,再也不用担心这些垃圾了!

            参考资料:

            疑难解答:

            该错误通常意味着找到 ODP.NET 正常,但未找到或未安装 Oracle 客户端。当体系结构不匹配(安装了 32 位 Oracle 客户端,但尝试使用 64 位非托管 ODP.NET,反之亦然)时,也会发生这种情况。这也可能是由于权限问题和路径问题以及应用程序域(您的 Web 应用程序或您的 EXE 或其他任何东西)无法找到 Oracle DLL 以通过网络实际与 Oracle 通信(ODP.NET Unmanaged DLL 基本上只是挂接到 ADO 之类的包装器。

            我发现这个问题的常见解决方案:

            应用程序是 64 位的?

            • 安装 64 位 Oracle 客户端(32 位无法使用)

            应用程序是 32 位的?

            • 安装 32 位 Oracle 客户端(64 位无法使用)

            已经为正确的体系结构安装了 Oracle 客户端?

            • 验证您的环境 PATH 和 ORACLE_HOME 变量,确保可以找到 Oracle(较新的版本可能使用 Registry)
            • 验证 ORACLE_HOME 和注册表中的设置(请记住:注册表是 32 位或 64 位的,因此请确保检查与您的应用匹配的那个!)
            • 验证ORACLE_HOME 文件夹的权限。如果您不知道它在哪里,请检查注册表。我已经看到 ASP.NET 应用程序工作进程正在使用网络服务用户并且由于某种原因并排安装 32 位和 64 位客户端导致权限从Authorized Users 组的第一个客户端中删除的情况。修复主文件夹上的 perms 修复了这个问题。
            • 与往常一样,使用 SysInternals Process Monitor 找出丢失或无法读取的文件非常方便。

            【讨论】:

              猜你喜欢
              • 2016-11-30
              • 1970-01-01
              • 2016-03-27
              • 1970-01-01
              • 1970-01-01
              • 2017-05-18
              • 2013-05-15
              • 2013-11-08
              • 2019-07-08
              相关资源
              最近更新 更多