DOBON.NETプログラミング道掲示板

■34635 / 親記事)  Oracle への OleDb 接続に失敗する
  
□投稿者/ kane123 一般人(1回)-(2021/01/29(Fri) 11:40:12)
  • アイコン環境/言語:[Windows 10 VB.net .net Framework 4.0] 
    分類:[.NET] 

    とあるOracleデータベースに接続を試みていますがうまくいきません。

    VB.net / OleDbで接続を試みています。

    今まで接続に成功したOracleDBの場合は、接続文字列は:

     Provider=OraOLEDB.Oracle.1;Data Source= (DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST= [HostName] )(PORT = 1521)) ) (CONNECT_DATA= (SERVICE_NAME = [ServiceName] ) ));User ID=xxxx;Password=xxxx;

    として成功していました。今回接続に失敗しているDBでは、上記の情報のうち、[ServiceName]が分からず、[HostName]、userID、Passwordのみが情報として持っているものになります。従って、[ServiceName]には暫定的に orclを入れていますが、これ自体が正しいのかは分かりません。

    フリーソフトの A5M2 を使用した場合は、当該DBへの接続に成功しており、
    その際「Oracle Client 不使用」の接続で成功しています。
     A5M2の接続情報入力では [HostName]、userID、Password
    の3つの情報だけを求めら、これらを入力すれば接続成功するので、同様なことを OleDbで行いたいのにできず困っております。

     また、接続できない場合のエラーメッセージは
    「ORA-12545: ターゲット・ホストまたはオブジェクトが存在しないため、接続に失敗しました(TNS-12545)」

     というものなので、上記の[HostName]の箇所がDNS名になっていることが原因かな、というのも
    あります。ただそうだとすれば、なぜA5m2がHostName を指定しただけで名前解決に成功しているのか、
    つじつまが合わず、不可解に思われます。

    ご教示いただければ幸いです。

    目指しているゴールは基本的に [HostName]、userID、Password だけを用いたOleDbドライバ向けの接続文字列の作成
    となります。 これとは別個に名前解決の問題もあるのであればその解決法も探っていきたいという感じです。





マルチポストを報告
違反を報告
引用返信 削除キー/
■34636 / ResNo.1)  Re[1]: Oracle への OleDb 接続に失敗する
□投稿者/ kane123 一般人(2回)-(2021/01/29(Fri) 11:52:54)
  • アイコンExcel VBA で下記の接続文字列を使用したところ、ドライバは ADODB ですが接続に成功しました。
    この接続文字列がそのまま OleDbで使えるか検証してみようと思います。
    ( もし、それで成功した場合は自己解決となり、申し訳なく思いますが、ご容赦願います。 )


    Dim con As New ADODB.Connection
    con.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=[HostName];" & _
    "User ID=xxxxx;Password=xxxxx;"
    con.Open
違反を報告
引用返信 削除キー/
■34637 / ResNo.2)  Re[2]: Oracle への OleDb 接続に失敗する
□投稿者/ 魔界の仮面弁士 大御所(1312回)-(2021/01/29(Fri) 19:24:29)
  • アイコン2021/01/29(Fri) 19:40:14 編集(投稿者)

    No34636に返信(kane123さんの記事)
    > Excel VBA で下記の接続文字列を使用したところ、ドライバは ADODB ですが接続に成功しました。

    それで繋がるということは…クライアント上の tnsnames.ora ファイルを
    メモ帳などで開いてみることで、必要な接続記述子を得ることが出来ると思いますよ。
    https://www.shift-the-oracle.com/oracle-net/tnsnames.html

    もしも Oracle Client (≠Oracle Instant Client) を導入済みであれば
    コマンドラインで「TNSPING HostName」を実行してみてください。
    tnsnames.ora の内容を読み取って表示し、疎通確認まで行ってくれます。
    ※上記の `HostName` の部分は、実際のネットサービス名に差し替えます。


    それと、最初の質問の HOST= [HostName] の HostName と、
    その次の投稿の Data Source = [HostName] の HostName は本来別物です。
    (今回はたまたま同じ名前に設定してあったのだと思います)


    > con.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=[HostName];" & _

    クライアントに tnsnames.ora ファイルが設置されている場合には、
     Data Source=ネットサービス名;
    の構文で済みます。

    tnsnames.ora が無い場合には、EZConnect (簡易接続ネーミングメソッド)で
     Data Source=サーバー名またはIPアドレス/サービス名;
     Data Source=サーバー名またはIPアドレス:1521/サービス名;
    の構文を使えます。
    https://docs.oracle.com/cd/F19136_01/ntcli/specifying-a-connection-by-using-the-easy-connect-naming-method.html


    ただし複数の記述子やアドレスリストが必要な場合には、
    EZConnect では指定できないので、最初の質問のような長い記述を使うか、
    あるいは tnsnames.ora を用意することになりますね。
    https://docs.oracle.com/cd/E16338_01/network.112/b56287/tnsnames.htm


    なお、ADODB ではなく、ODP.NET Managed Provider で繋ぐ場合には
    tnsnames.ora 相当の記述を、アプリごとの app.config あるいは web.config 内に
    埋め込んでおくことも出来ます。
違反を報告
引用返信 削除キー/
■34638 / ResNo.3)  Re[3]: Oracle への OleDb 接続に失敗する
□投稿者/ kane123 一般人(3回)-(2021/01/30(Sat) 17:57:28)
  • アイコンありがとうございます。

    解決することができました。

    tnsnames.ora の存在を忘れておりました。。
解決み!
違反を報告
引用返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -