52

いくつかのマシンで発生している問題のトラブルシューティングに使用する非常に単純なアプリケーションを開発していますが、そこまで到達する前に、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 はディレクトリ内の tnsnames.ora を検出C:\oracle\11g\network\adminできるのに、Oracle.ManagedAccess は検出できないのはなぜですか?

4

8 に答える 8

66

ODP.NET管理対象ドライバでTNS名を解決するための優先順位は次のとおりです(こちらを参照):

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

あなたのサンプルが Oracle.DataAccess では機能するが、Oracle.ManagedDataAccess では機能しない理由は、後者では Windows レジストリ ベースの構成がサポートされていないためだと思います (ドキュメントを参照) - ODP.NET インストールでは ORACLE_HOME レジストリ キー (HLKM\SOFTWARE\Oracle) が設定されます。 \Key_NAME\ORACLE_HOME) は、管理されていない部分によってのみ認識されます。

于 2013-11-18T14:41:15.420 に答える
17

構成ファイルに 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>
于 2013-08-06T07:05:54.970 に答える
7

TNSNAMES.ORA を探している場所がわからないというすべての Oracle の混乱を避けるために (複数の Oracle バージョンと 32/64 ビットの追加の混乱があります)、既存の TNSNAMES.ORA から独自の構成に設定をコピーできます。ファイルを作成し、それを接続に使用します。
TNSNAMES.ORA の「DSDSDS」参照に満足しているとします。これは次のようにマップされます。

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

最初の「=」の後のテキストを取得して、「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;";

于 2016-10-05T16:02:42.667 に答える
3

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

DATA SOURCE=DSDSDS:1521/ORCL;
于 2015-09-30T15:18:15.310 に答える
-2

同じエラー メッセージが表示されました。これを解決するために、Oracle.ManagedDataAccessアセンブリを古いOracle.DataAccessアセンブリに置き換えました。新しいアセンブリで見つかった新しい機能が必要な場合、このソリューションは機能しない可能性があります。私の場合、新しいOracleアセンブリを構成しようとするよりも優先度の高い問題が多数あります。

于 2015-06-12T15:18:18.433 に答える