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

Sam*_*rum 16 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)
  ...
Run Code Online (Sandbox Code Playgroud)

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

谢谢

ono*_*012 7

两种选择:

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

  • 使用Oracle.ManagedDataAccess.dll

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

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

NB 在我看来这对控制台应用程序有好处,但如果你打算安装你的应用程序很烦人,所以我在这种情况下安装客户端。


Hit*_*tsa 7

最简单的方法!

  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客户端软件即可连接到数据库.


Ale*_*ris 6

这两个Oracle数据提供程序的.NET(从Oracle)和.NET Framework数据提供程序的Oracle(微软)需要机器上安装Oracle客户端.


And*_*der 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");
}
Run Code Online (Sandbox Code Playgroud)

对于Oracle nls_lang列表,请访问此站点:https://docs.oracle.com/html/B13804_02/gblsupp.htm

在那之后,一切顺利.

我希望它有所帮助.


ang*_*son 2

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

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

  • 请注意,如果您仅安装了 32 位 Oracle 客户端,则在 64 位计算机上也可能会出现此错误。 (5认同)