2013-07-03 745 views
26

私はいくつかのマシンで問題を解決するために使っている非常に単純なアプリケーションを開発していますが、それまでにもCPUアーキテクチャの違いやOracleデータベースライブラリなどいくつかの問題がありました。Oracle.DataAccessは、なぜOracle.ManagedDataAccessが機能しないのですか?

私は、C:\oracle\11g\network\adminディレクトリにあるtnsnames.oraのデータベースサーバを持っています。私はこのサーバーをtnspingする場合、私は希望の応答を取得します。 Oracle.DataAccess.Clientを使用してこのサーバーに接続するためにC#プログラムをコード化すると、次のコードで動作します。

string connectionString = "Data Source=DSDSDS;User Id=UNUNUN;Password=PWPWPW;"; 
DataTable dataTable = new DataTable(); 

using (var connection = new OracleConnection(connectionString)) { 
    connection.Open(); 
    using (var command = new OracleCommand()) { 
     command.Connection = connection; 
     command.CommandText = sql; 
     command.CommandType = CommandType.Text; 
     using (var oda = new OracleDataAdapter(command)) { 
      oda.Fill(dataTable); 
     } 
    } 
} 

ただし、Oracle.DataAccessは、実行されるシステムのアーキテクチャに依存します。私は、アーキテクチャに依存しない別のライブラリOracle.ManagedDataAccessがあることを知りました。このライブラリを使用すると、サーバーに接続できなくなります。 ORA-12545: Network Transport: Unable to resolve connect hostnameがスローされます。

これはなぜですか?私がこれまでに読んだことに基づいて、これは問題ではないので、これらの2つの図書館の違いは何か。

追加情報:

  • %のORACLE_HOME%と%TNS_ADMIN%は定義されていない(つまりTNSPINGとOracle.DataAccessの仕事を覚えている)
  • C:\oracle\11g\BINがPATH定義されています。
  • 私は.exeファイルと同じ場所にtnsnames.oraファイルを移動した場合は私のマシンが一つだけtnsnames.oraファイル

を持って、それが動作します。 Oracle.DataAccessがC:\oracle\11g\network\adminディレクトリのtnsnames.oraを検索できますが、Oracle.ManagedAccessは検出できないのはなぜですか?

+0

私は実際にかかわらず、App.configファイルでTNS_ADMIN設定の、同じ問題を抱えています。 – flindeberg

答えて

42

ODP.NETにTNS名を解決するための優先順位、管理ドライバは、この(hereを参照)である。

  1. データソースエイリアスは、.NET設定ファイルのセクションの下の 'dataSources'セクションにあります。
  2. tnsnames.oraファイルのデータソースエイリアスで、.NET構成ファイルの「TNS_ADMIN」で指定された場所にあります。
  3. .exeと同じディレクトリにあるtnsnames.oraファイルのデータソースエイリアス。
  4. %TNS_ADMIN%(%TNS_ADMIN%は環境変数設定)に存在するtnsnames.oraファイルのデータ・ソース別名。
  5. %ORACLE_HOME%¥network¥adminにあるtnsnames.oraファイルのデータ・ソース別名(%ORACLE_HOME%は環境変数設定です)。 ODP.NETのインストールはORACLE_HOMEレジストリキーを設定します - 私はあなたのサンプルがOracle.ManagedDataAccessでOracle.DataAccessで動作しますが、いない理由は、(documentationを参照)、Windowsのレジストリベースの設定は、後者のためにサポートされていないことであると信じてい

(HLKM¥SOFTWARE¥Oracle¥Key_NAME¥ORACLE_HOME)が含まれています。

+2

よく、それは確かに空気を少しクリアします。しかし、私の最近の問題は "認識できない構成セクションoracle.manageddataaccess.client"でした。 「

」のようになります。 – Rakshasas

+0

それは間違いなく動作します(デスクトップとウェブの数十のインストールで検証済み)。ただし、これを使用する場合は、configSections/section @ typeのアセンブリ署名(バージョン番号、公開鍵など)が、使用するOracle.ManagedDataAccess.dllと正確に一致することを確認してください。 – metalheart

+2

すばらしい説明ありがとう。本番環境では、HKEY_LOCAL_MACHINE¥SOFTWARE¥Oracle¥ODP.NET.Managed¥4.121.2.0というキーを追加し、tnsnames.oraを指す文字列値TNS_ADMINを追加しました。 – Gandarez

9

configファイルのために、tnsnames.oraへのパスを追加してください:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <oracle.manageddataaccess.client> 
    <version number="4.112.3.60"> 
     <settings> 
     <setting name="TNS_ADMIN" value="C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN\" /> 
     </settings> 
    </version> 
    </oracle.manageddataaccess.client> 
</configuration> 
+0

TNS_ADMINが正しい値を持つ場合、バージョン番号に問題がある可能性があります。 kolbasov

+0

私はそれをやっています。プログラムで、tnsnamesとsqlnetの両方が使用されているのを見ると面白いでしょう;)私は数日前にリリースされたプロダクションバージョン121.1.0を使用しています。しかし、どうもありがとう! :) – flindeberg

+0

私はこれを試してみましたが、私はうまくいきません。私はパスをC:\ oracle \ 11g \ network \ admin \に変更しましたが、私は受け取っています:Oracle.ManagedDataAccess.dllで 'System.TypeInitializationException'タイプの最初のチャンス例外が発生しました System.TypeInitializationException: 'OracleInternal.Common.ProviderConfig'のイニシャライザが例外をスローしました。 ---> System.Configuration.ConfigurationErrorsException:構成システムの初期化に失敗しました---> System.Configuration.ConfigurationErrorsException:構成セクションoracle.manageddataaccess.clientが認識できません。 – Rakshasas

1

私はこれを解決するために同様の問題を抱えていました.ODPをアンインストールすることでした。ネットをインストールして、oracleサーバーと同じディレクトリに再インストールしてください。サーバオプションを使用すると、ほとんどの製品が既にインストールされていることに気づくでしょう(12cデータベースインストール中)ので、他の機能を選択してインストールを完了してください。データベースが配置されている場合は...

は............この回避策は、あなたのラップトップ上で、すなわち、同じマシン上の12Cをインストールしている場合にのみ機能することを

に注意してください。あなたのラップトップ以外のサーバーマシンを選択し、サーバーではなくクライアントオプションを選択して、app.configにTNS_ADMINを含め、バージョンを指定するのを忘れないでください...

私のインストールは私のラップトップにあるので、 App.configは以下のようになります。

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
    </startup> 
</configuration> 


/////////the below code is a sample from oracle company//////////////// 


using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Data.Common; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using Oracle.ManagedDataAccess.Client; 

///copy these lines in a button click event 
    string constr = "User Id=system; Password=manager; Data Source=orcl;"; 
// Click here and then press F9 to insert a breakpoint 
     DbProviderFactory factory = 
    DbProviderFactories.GetFactory("Oracle.ManagedDataAccess.Client"); 
      using (DbConnection conn = factory.CreateConnection()) 
      { 
       conn.ConnectionString = constr; 
       try 
       { 
        conn.Open(); 
        OracleCommand cmd = (OracleCommand)factory.CreateCommand(); 
        cmd.Connection = (OracleConnection)conn; 

//to gain access to ROWIDs of the table 
//cmd.AddRowid = true; 
        cmd.CommandText = "select * from all_users"; 

        OracleDataReader reader = cmd.ExecuteReader(); 

        int visFC = reader.VisibleFieldCount; //Results in 2 
        int hidFC = reader.HiddenFieldCount; // Results in 1 

        MessageBox.Show(" Visible field count: " + visFC); 

        MessageBox.Show(" Hidden field count: " + hidFC); 


        reader.Dispose(); 
        cmd.Dispose(); 
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(ex.Message); 
         MessageBox.Show(ex.StackTrace); 
       } 
      } 
1

私は同じエラーメッセージを受け取りました。これを解決するために、私はちょうどよりOracle.DataAccessアセンブリとOracle.ManagedDataAccessアセンブリを置き換えました。このソリューションは、新しいアセンブリに新しい機能が必要な場合は機能しません。私の場合、新しいOracleアセンブリを構成しようとすると、さらに優先度の高い問題が発生します。

1

接続文字列で探していたフォーマットが見つかったら、Oracle.ManagedDataAccessでこれでうまくいきました。別々に何かを混乱させることなく。それはTNSNAMES.ORA(私は追加複数のOracleバージョンの混乱と32/64ビットを持っている)を探している場合、既存の設定をコピーすることができます知らないのすべてのOracleの混乱を避けるために

DATA SOURCE=DSDSDS:1521/ORCL; 
1

TNSNAMES.ORAを自分の設定ファイルに追加し、それをあなたの接続に使用してください。あなたが最初の「=」の後にテキストを取るとどこが「DSDSDS」を使用していることを使用することができます

DSDSDS=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(Host=DSDSDSHost)(Port=4521)))(CONNECT_DATA=(SERVICE_NAME=DSDSDSService)))


はあなたのような何かにマップTNSNAMES.ORAの「DSDSDS」を参照して満足していると言います接続方法を知るためにTNSNAMES.ORAを見つける必要はありません。
今すぐあなたの接続文字列は次のようになります。
string connectionString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(Host=DSDSDSHost)(Port=4521)))(CONNECT_DATA=(SERVICE_NAME=DSDSDSService)));User Id=UNUNUN;Password=PWPWPW;";

+0

長いタイムゾーンのどこに接続タイムアウトパラメータを置くべきですか? –

+1

許可されるすべての属性は、セミコロンで区切られています。データソース属性は、そのように見えるものですいとこそれ!オラクルのドキュメントには属性の完全なリスト(二重引用符の最後のセミコロンの後の最後に付ける接続タイムアウトを含む):https://docs.oracle.com/cd/B13789_01/win.101/b10117/features001.htm – user3902302