web-dev-qa-db-ja.com

「Oracle.DataAccess.Client.OracleConnection」の型初期化子が例外をスローしました

Oracle Data Provider for .NETを使用するアプリケーションを開発しました。 OracleクライアントとODP.NETがインストールされていない別のコンピューターにアプリケーションファイル(.exe)とODPライブラリ(Oracle.DataAccess.dll)をコピーします。アプリケーションを実行すると、エラーmsgが発生しました。「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クライアントをインストールする必要がありますか?はいの場合、インストールする必要はないが、アプリケーションを実行できる他の方法はありますか?

ありがとうございました

16
Sambath Prum

簡単な方法!!!

  1. プロジェクトを右クリックして、「NuGetパッケージの管理...」を選択します
  2. Oracle.ManagedDataAccessを検索します。それをインストールします。

Entity Frameworkを使用しており、Visual Studioバージョンが2012以降の場合

  1. 再度Oracle.ManagedDataAccess.EntityFrameworkを検索します。それをインストールします。
  2. .csファイルで以下の名前空間を使用します。
    using Oracle.ManagedDataAccess.Client;
    using Oracle.ManagedDataAccess.EntityFramework;

完了。 Visual Studioを再起動して、コードをビルドします。

これらのパッケージは何をしますか?
これらのパッケージをインストールした後、データベースに接続するために追加のOracleクライアントソフトウェアをインストールする必要はありません。

7
Hitsa

Oracle Data Provider for .NET (Oracleから)と 。NET Framework Data Provider for Oracle (Microsoftから)の両方で、マシンにOracleクライアントをインストールする必要があります。

6
Aleris

OK、同じプロセスを使用した他のアプリケーションが確実に機能したことがわかっている場合。新しいアプリケーションで、データアクセスリファレンスと3つの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)

正しい参照とファイルを使用して別のアプリケーションを作成しようとすると、そのエラーメッセージが表示されます。

修正:3つのファイルすべてを強調表示し、[出力にコピー] = [新しい場合はコピー]を選択しました。 dllの1つが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

その後、すべてがスムーズに機能しました。

役に立てば幸いです。

6
Andrew Grinder

Oracle.ManagedDataAccess.dllを使用してみてください

NuGet(「Oracle管理」を検索)またはダウンロード ODP.NET_Managed.Zip で入手できます(リンクはベータ版ですが、正しい方向を示しています)

これを使用して、デプロイするコンピューターにOracleクライアントをインストールする必要がないようにします。 N.B.私の意見では、これはコンソールアプリには適していますが、アプリケーションをインストールする場合は迷惑です。

4
ono2012

これは古くても関連する質問であり、ここでの回答は役に立ちますが、OPの質問の両方に完全に答えた回答はありません。

1。アプリケーションを実行するコンピューターにODP.NETとOracleクライアントをインストールする必要がありますか?

[〜#〜] yes [〜#〜]-ODP.NETを使用している場合、Unmanaged。これは、通常、Oracle Clientインストーラで「Oracle Data Provider for .NET」を選択したときにインストールするバージョンです(たとえば)。これをOracleからダウンロードします(グーグルit:OracleのURLは頻繁に変更されます)。

ただし、ODP.NET、Managedを使用している場合(おそらくこれを代わりにこれを使用したい場合)、いいえ、完全なOracle Clientではなく、アプリでODP.NET、Managedのみをインストール(またはデプロイ)する必要があります。詳細は以下をご覧ください。

2。はいの場合、インストールする必要はないが、アプリケーションを実行できる他の方法はありますか?

はい、少なくとも1つの方法があります。そして、ODP.NETの管理ポートです。

残念ながら、ODBC、MicrosoftのOracle Provider for .NET(はい、古い、非推奨のもの)、ODP.NET Unmanaged DLL)を含む通常の回避策では、すべてOracleクライアントをインストールする必要があります。 Oracleの友人が私たちに素敵な小さな(〜5MB)DLLを提供します。これも管理されます。これは、32ビットおよび64ビットバージョンをデポする必要がなくなりました。 32ビットおよび64ビットのOracleクライアント!10.0.2.1(または何でも)に対してビルドするアセンブリバインディングでこれ以上の問題はありませんが、顧客は9iから12cまでのさまざまなクライアント(「g」を含む)をインストールしますアプリと一緒に出荷し、nugetで管理できるためです。

ただし、nugetパッケージとして利用可能なODP.NET Managedを使用する場合、Oracle Clientをインストールする必要はありません。 ODP.NET、マネージDLL。以前にODP.NET、アンマネージDLLを使用していた場合、切り替えるのは非常に簡単です。マネージODP.NETへのすべての参照(csharpの.csprojファイルなど)を変更してから、usingステートメント、たとえば:using Oracle.DataAccess.Clientusing Oracle.ManagedDataAccess.Clientになります。 (ODP.NET Unmanagedで公開されているフルクライアントで、高度なDB管理機能の一部を使用していると思われる場合を除き、私は自分でやったことはありません。幸運を祈ります。)また、あなたのapp.config/web.configファイルからこれらの迷惑なassemblyBindingRedirectノードをすべて破棄し、そのジャンクを二度と発汗させないでください!

参照:

トラブルシューティング:

通常、このエラーは、ODP.NETは正常に検出されたが、Oracleクライアントが見つからなかったか、インストールされていないことを意味します。これは、アーキテクチャが一致しない場合にも発生する可能性があります(32ビットのOracleクライアントがインストールされているが、64ビットのアンマネージODP.NETを使用しようとしている、またはその逆)。これは、アクセス許可の問題、パスの問題、およびアプリドメイン(WebアプリやEXEなど)に関するその他の問題が、ネットワーク経由でOracleと実際に通信するOracle DLLを見つけることができないために発生する可能性があります(ODP.NET Unmanaged DLLは基本的に、ADO and stuff)にフックする単なるラッパーです。

この問題に対して私が見つけた一般的な解決策:

アプリは64ビットですか?

  • 64ビットOracleクライアントをインストールします(32ビットの1つは動作しません)

アプリは32ビットですか?

  • 32ビットOracleクライアントをインストールします(64ビットの1つは動作しません)

Oracle Clientは正しいアーキテクチャ用にすでにインストールされていますか?

  • 環境のPATHおよびOracle_HOME変数を確認し、Oracleが見つかることを確認します(新しいバージョンでは代わりにレジストリを使用できます)
  • Oracle_HOMEとレジストリ内の設定を確認します(レジストリは32ビットまたは64ビットのいずれかなので、アプリに一致するものを必ず確認してください!)
  • Oracle_HOMEフォルダーのアクセス許可を確認します。これがどこにあるかわからない場合は、レジストリを確認してください。 ASP.NETアプリワーカープロセスがNetwork Serviceユーザーを使用しており、何らかの理由で32ビットクライアントと64ビットクライアントを並べてインストールすると、Authorized Usersグループの最初のクライアントから権限が削除される場合があります。 ..ホームフォルダーのパーマを修正すると、これが修正されました。
  • いつものように、SysInternals Process Monitorを使用して、欠落しているファイルや読み取れないファイルを見つけるのは便利です。
1

これらのクラスを機能させるには、Oracleクライアントドライバーをインストールする必要があります。

Oracleを処理できるサードパーティの接続フレームワークが存在する場合がありますが、特定のフレームワークを知っている人がいるかもしれません。

1
tuinstoel