私は非常に単純なアプリケーションを開発しており、これを使用していくつかのマシンで発生している問題のトラブルシューティングを行いますが、それまでに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つのライブラリの違いは、これまで読んだ内容に基づいて、これが問題になることはないためです。
追加情報:
C:\Oracle\11g\BIN
が定義されています。tnsnames.ora
ファイルが1つしかありませんTnsnames.oraを.exeファイルと同じ場所に移動すると、機能します。 Oracle.DataAccessがC:\Oracle\11g\network\admin
ディレクトリでtnsnames.oraを見つけることができるのに、Oracle.ManagedAccessができないのはなぜですか?
ODP.NET Managed DriverのTNS名を解決するための優先順位は次のとおりです( ここ を参照)。
サンプルがOracle.DataAccessで動作するがOracle.ManagedDataAccessでは動作しない理由は、Windowsレジストリベースの構成が後者ではサポートされていないためだと思います( documentation を参照)-ODP.NETインストールはOracle_HOMEレジストリを設定しますキー(HLKM\SOFTWARE\Oracle\Key_NAME\Oracle_HOME)。これは、管理対象外パーツによってのみ認識されます。
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>
接続文字列で探している形式を見つけたら、Oracle.ManagedDataAccessでこのようにうまく機能しました。別に何かをいじる必要はありません。
DATA SOURCE=DSDSDS:1521/ORCL;
同様の問題がありました......これを解決するために、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);
}
}
私の場合、上記のすべては問題ありませんでしたが、それでも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
パーティーに「少し」遅れるが、これに対する本当の答え-あなたがOracle.ManagedDataAccess
ODP.NETプロバイダーを使用する場合、あなたはnetwork\admin
、Oracle client
、Oracle_Home
などのようなものを忘れるべきです。
必要なものは次のとおりです
C:\Program Files (x86)
の下に比較的小さなインストールが作成されます。 60Mb未満のフル開発ツールを使用この時点で、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アプリケーション構造内ですべてを実行できます。