web-dev-qa-db-ja.com

Oracle.DataAccessが機能するのにOracle.ManagedDataAccessが機能しないのはなぜですか?

私は非常に単純なアプリケーションを開発しており、これを使用していくつかのマシンで発生している問題のトラブルシューティングを行いますが、それまでにCPUアーキテクチャの違いやOracleデータベースライブラリなどのいくつかの問題に遭遇しました。

tnsnames.oraディレクトリにデータベースサーバーがあり、C:\Oracle\11g\network\adminにリストされています。このサーバーを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が機能することを思い出してください)
  • PATHにはC:\Oracle\11g\BINが定義されています。
  • 私のマシンにはtnsnames.oraファイルが1つしかありません

Tnsnames.oraを.exeファイルと同じ場所に移動すると、機能します。 Oracle.DataAccessがC:\Oracle\11g\network\adminディレクトリでtnsnames.oraを見つけることができるのに、Oracle.ManagedAccessができないのはなぜですか?

37
Jeff

ODP.NET Managed DriverのTNS名を解決するための優先順位は次のとおりです( ここ を参照)。

  1. .NET構成ファイルのセクションの下にある「dataSources」セクションのデータソースエイリアス。
  2. .NET構成ファイルの「TNS_ADMIN」で指定された場所にあるtnsnames.oraファイルのデータソースエイリアス。
  3. .exeと同じディレクトリにあるtnsnames.oraファイルのデータソースエイリアス。
  4. %TNS_ADMIN%に存在するtnsnames.oraファイルのデータソースエイリアス(%TNS_ADMIN%は環境変数設定です)。
  5. %Oracle_HOME%\ network\adminにあるtnsnames.oraファイルのデータソースエイリアス(%Oracle_HOME%は環境変数の設定です)。

サンプルがOracle.DataAccessで動作するがOracle.ManagedDataAccessでは動作しない理由は、Windowsレジストリベースの構成が後者ではサポートされていないためだと思います( documentation を参照)-ODP.NETインストールはOracle_HOMEレジストリを設定しますキー(HLKM\SOFTWARE\Oracle\Key_NAME\Oracle_HOME)。これは、管理対象外パーツによってのみ認識されます。

57
metalheart

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>
13
kolbasov

接続文字列で探している形式を見つけたら、Oracle.ManagedDataAccessでこのようにうまく機能しました。別に何かをいじる必要はありません。

DATA SOURCE=DSDSDS:1521/ORCL;
2
Underground

同様の問題がありました......これを解決するために、ODPをアンインストールしました。 Netおよび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
Siddiqui

私の場合、上記のすべては問題ありませんでしたが、それでもORA-12545: Network Transport: Unable to resolve connect hostname

Oracleマシンにpingを実行してみたところ、表示できないことがわかり、hostsファイルに追加しました。その後、別のエラーメッセージORA-12541: TNS:no listener。調査した後、異なるマシンから同じホスト名にpingを送信して異なるIPアドレスを取得していることがわかり(理由はわかりません)、ホストファイルのIPアドレスを変更し、100%で問題を解決しました。

明らかなように自分の経験を書くのは面倒ですが、問題は上記の設定にあると確信していましたが、リモートDBマシンが本当に見えるかどうかを確認するのを完全に忘れていました。何が起こっているのかアイデアがわからないときは、覚えておいてください。

これらのリンクは私を大いに助けました:

http://www.moreajays.com/2013/03/ora-12545-connect-failed-because-target.htmlhttp://www.orafaq.com/wiki/ ORA-12541

0
ppenchev

パーティーに「少し」遅れるが、これに対する本当の答え-あなたがOracle.ManagedDataAccess ODP.NETプロバイダーを使用する場合、あなたはnetwork\adminOracle clientOracle_Homeなどのようなものを忘れるべきです。

必要なものは次のとおりです

  1. VS for Oracle Developer Toolsまたは[〜#〜] odac [〜#〜]をダウンロードしてインストールします。注-開発ツールはODACをインストールします。これにより、C:\Program Files (x86)の下に比較的小さなインストールが作成されます。 60Mb未満のフル開発ツールを使用
  2. プロジェクトに、ODP.netの対応するバージョンでNugetパッケージをインストールします(Oracle.ManagedDataAccess.dll)これを参照します
  3. この時点で、2つの接続オプションがあります。

    • a)接続文字列でdatasourceを次の形式で設定します

      DataSource=ServerName:Port/SID . . .またはDataSource=IP:Port/SID . . .

    • b)tnsnames.oraファイルを作成します(以前のエクスペリエンスとは異なるだけです)。それにエントリがあります:

      AAA =(説明=
      (ADDRESS =(PROTOCOL = TCP)(Host = ServerNameOrIP)(PORT = 1521))
      (CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = SIDNAME)))

      そして、このファイルを、アプリケーションが実行されているbinフォルダーに配置します。接続名-DataSource=AAA . . .を使用して接続できるようになりました。つまり、tnsnames.oraがありますが、ODP.netでmanaged少し動作します-ローカルTNSファイルを作成します。そして今、それを管理するのは簡単です。

要約すると、managedを使用すると、重いOracleクライアント、Oracle_home、またはOracleインストールフォルダーの深さを知る必要はありません。 .netアプリケーション構造内ですべてを実行できます。

0
T.S.