2016-06-29 31 views
0

から接続するとき、私はこのエラーを取得して(私はOracle.DataAccess DLLを使用しています)しています:Oracle接続オープンエラー.NETコード

{Oracle.DataAccess.Client.OracleConnection} 

(Oracle.DataAccess.Client.OracleException).DataSource threw an exception of type 'System.NullReferenceException' 

のStackTrace:

at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 
errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* 
pOpoSqlValCtx, Object src, String procedure, Boolean bCheck, Int32 
isRecoverable) 
    at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, 
OracleConnection conn, IntPtr opsErrCtx, Object src) 
    at Oracle.DataAccess.Client.OracleConnection.Open() 

コード:

using (OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["myConnection"].ConnectionString)) 
      { 
       using (OracleCommand cmd = conn.CreateCommand()) 
       { 
        cmd.CommandText = "<<Procedure Name>>"; 
        cmd.Parameters.Add("v_cur", OracleDbType.RefCursor).Direction = ParameterDirection.Output; 

        conn.Open(); --line throws exception 
        using (OracleDataReader reader = cmd.ExecuteReader()) 
        { 
         while (reader.Read()) 
         { 
          retVal = reader["VALUE"].ToString(); 
         } 
         reader.Close(); 
        } 
       } 
      } 

入力は役に立ちますか?ありがとう。

+0

実際のエラーメッセージを共有したことはありません。 – mason

+0

更新しました。ありがとうございます。 – Sharpeye500

+1

管理していない代わりに管理対象の(Oracle.ManagedDataAccess.dll)バージョンのDLLを実行することができない場合に試してみることができますが、私の不思議なOracle接続の問題が修正されています。管理されたバージョンは自己完結型であり、Oracleクライアントに依存せず、32ビットと64ビットでシームレスに動作します。 – omaraguirre

答えて

1

一つのことは、代わりに管理以外のDLLの管理(Oracle.ManagedDataAccess.dll)バージョンを実行することです、私はそれが私の奇妙な神託の一部を修正することを発見しました接続の問題。管理バージョン、自己完結型であるOracleクライアントに依存しない、それがシームレスに32ビットおよび64ビットで動作します

0

omaraguirreユーザーがコメントに示唆したことを試してみました。

この手順をたどると、役立つ可能性があります。

  1. プロジェクトからOracle.DataAccessへの既存の参照を削除し、ダウンロードしたフォルダから新しいOracle.ManagedDataAccess.dllを追加します。odp.net \ \共通\ Oracle.ManagedDataAccess.dllを管理していました。

  2. プロパティを設定すると、プロジェクトと一緒に配備されるようにローカルをコピーします。

  3. コードに新しい「使用」行を追加することを忘れないでください。Oracle.ManagedDataAccess.Clientを使用します。

  4. プロジェクトプラットフォームのターゲットをAnyCPUに変更すると、動作します。あなたがいない場合、あなたが試すことができ

2

私はOracleのサイトからODAC121021Xcopy_32bitをダウンロードしたzipを抽出し、INSTALL.BATファイルを使用してインストール。

私は同じ問題に直面しました。オマラギアレありがとう。 Omaraguirreが述べたように、Oracle.ManagedDataAccess.dllを参照し、問題は修正されました。私は問題なく接続を開くことができた。

しかし、Oracle.DatAccess.dllが接続を開こうとしている間にNull参照例外をスローする理由を理解したかったのです。私は、(oci.dll、ociwin32.dllなどの)サポートDLLがエラーなしで接続を開くために必要であることを発見しました。 instantclient_12_1(このフォルダは、抽出されたODAC121021Xcopy_32bitフォルダ内にあります)フォルダからoracleインストールされたbinディレクトリ(C:\ oracle \ bin、私のマシンにあります)にすべてのdllファイルをコピーしました。 Oracle.DataAccess.dllは、接続を開くときにエラーをスローしません。

もう1つOracle.ManagedDataAccess.dllがサポートされているすべてのdllファイルを内部的にロードします。しかし、Oracle.DataAccess.dllは、実行中のアプリケーション・ディレクトリ(console/WinFormアプリケーションの場合)またはoracleインストールのbinディレクトリ(Webアプリケーションの場合)に存在するサポートdllを必要とします。 Oracle.DataAccess.dllとOracle.ManagedDataAccess.dll dllの違いは@https://docs.oracle.com/database/121/ODPNT/intro003.htm#ODPNT131

+0

ありがとう!!私は数日間苦労してきました! さらに、ManagedDataAccessはUDTを処理しません – Madagaga