'Oracle.DataAccess.Client.OracleConnection'的类型初始值设定项引发了异常

时间:2009-05-27 06:42:56

标签: odp.net oracleclient

我开发了一个使用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客户端?如果是,是否有其他方式我不必安装它们但仍然可以运行我的应用程序?

谢谢

7 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:6)

好的,当您确定其他使用相同过程的应用程序有效时;在您的新应用程序上确保您拥有数据访问参考和三个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

之后,一切顺利。

我希望它有所帮助。

答案 2 :(得分:6)

最简单的方式!!!

  1. 右键单击项目并选择“管理NuGet包...
  2. 搜索 Oracle.ManagedDataAccess 。安装它。
  3. 如果您使用实体框架 Visual Studio 版本 2012或更高版本,那么

    1. 再次搜索 Oracle.ManagedDataAccess.EntityFramework 。 安装它。
    2. 在.cs文件中使用以下名称空格:
      使用Oracle.ManagedDataAccess.Client;
      使用Oracle.ManagedDataAccess.EntityFramework;
    3. 完成了。现在重新启动Visual Studio并构建代码。

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

答案 3 :(得分:4)

尝试使用 Oracle.ManagedDataAccess.dll

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

我使用它,以便我部署的计算机不需要安装Oracle客户端。注:在我看来,这对于控制台应用程序很有用,但如果你打算安装你的应用程序会很烦人。

答案 4 :(得分:1)

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

可能存在可以处理Oracle的第三方连接框架,也许其他人可能知道某些特定的框架。

答案 5 :(得分:1)

答案 6 :(得分:1)

这是一个古老但仍然相关的问题,尽管此处的答案很有用,但没人能完全解决OP的两个问题。

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

-如果您使用的是ODP.NET,则不受管理。这是在Oracle Client安装程序中选择“用于.NET的Oracle数据提供程序”时通常安装的版本。您可以从Oracle下载此文件(只需在Google上搜索:Oracle URL经常更改)。

但是,如果您使用的是受管理的ODP.NET(并且您可能想改用它),则否,您只需要安装(或部署)由应用管理的ODP.NET,而不是完整的Oracle。客户。有关详情,请参见下文。

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

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

不幸的是,通常的解决方法包括ODBC,Microsoft的.NET的Oracle Provider(是的,这个旧的,已弃用的Oracle Provider)以及ODP.NET,非托管的DLL都需要安装Oracle客户端。直到Oracle的朋友给我们提供了一个不错的(〜5MB)小DLL,而且该DLL也已被管理。这意味着不再需要部署32位和64位版本来与32位和64位Oracle客户端配合使用!不再需要针对10.0.2.1(或任何其他版本)进行构建的程序集绑定问题,而是客户可以安装从9i到12c的一系列客户端,包括中间的“ g”客户端),因为您可以将其发货使用您的应用,并通过nuget对其进行管理。

但是,如果您使用的是作为nuget软件包提供的Managed ODP.NET,则不需要安装Oracle客户端。您只需要ODP.NET Managed DLL。而且,如果您以前使用的是ODP.NET非托管DLL,切换起来非常容易:只需将所有引用更改为托管ODP.NET(csharp中的.csproj文件等),然后更改任何{{{1 }}语句,例如:using变成using Oracle.DataAccess.Client就是这样! (除非您应该在完整客户端中使用某些更高级的数据库管理功能,这些功能在ODP.NET中显示为“非托管”,我还没有自己做,所以祝您好运。)。还要从您的using Oracle.ManagedDataAccess.Client / assemblyBindingRedirect文件中剔除所有那些烦人的app.config节点,再也不会再浪费那些垃圾了!

参考文献:

故障排除:

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

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

应用程序是64位的吗?

  • 安装64位Oracle Client(32位将无法工作)

应用程序是32位的吗?

  • 安装32位Oracle Client(64位将无法工作)

已经为正确的体系结构安装了Oracle Client?

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