none
SQL Server 2012 から Oracle への接続 RRS feed

  • 質問

  • SQL Server初心者です。

    SQL Server 2012 から Oracle へ接続し、テーブルのデータを定期的に取り込む方法を模索していますが、

    3つの方法を試してみたもののエラーが発生して解決できません。

    どなたかお知恵をお借りできませんでしょうか。

    【環境】

    <SQL Server側サーバ>

    • Windows Server 2012 R2 (64bit)
    • SQL Server 2012
    • Oracle  Client 12c (64bit)

    <Oracle側サーバ>

    • Windows Server 2008 R2 (64bit)
    • Oracle Database 11g (64bit)

    【試した方法】

    1.SSISの接続マネージャで接続

    SSISのOLEDBソースでプロバイダーを「Microsoft OLE DB Provider for Oracle」とし、

    サーバ名、ユーザ名、パスワードを入力後、「接続のテスト」を押すと、下記メッセージが出て進めません。

    プロバイダーの初期化中にエラーが発生したため、接続のテストに失敗しました。

    Oracle クライアントとネットワークコンポーネントが見つかりません。これらのコンポーネントはOracle

    Corporationから提供され、Oracle Version 7.3.3(またはそれ以降)のクライアント ソフトウェアの

    一部としてインストールされます。

    プロバイダーは、これらのコンポーネントがインストールされるまで機能しません。

    2.SSMSのデータベースのインポート(Microsoft OLE DB Provider for Oracle

    SSMSのインポートウィザード画面でデータソースを「Microsoft OLE DB Provider for Oracle」とし、

    サーバ名、ユーザ名、パスワードを入力後、「接続のテスト」を押すと、1と同じメッセージが出て進めません。

    3.SSMSのデータベースのインポート(.Net Framework Data Provider for Oracle

    SSMSのインポートウィザード画面でデータソースを「.Net Framework Data Provider for Oracle」とし、

    User ID、Password、Data Sourceを入力後、「次へ」を押すと、下記メッセージが出て進めません。

    操作を完了できませんでした。

    追加情報:

     → Oracle クライアント ライブラリを読み込もうとしましたが、BadImageFormatExceptionが発行されました。

       この問題は、32ビットのOracleクライアントコンポーネントがインストールされている環境で64ビットモードを

      実行すると発生します。 (System.Data.OracleClient)

      →間違ったフォーマットのプログラムを読み込もうとしました。(HRESULT からの例外:0x8007000B)

      (System.Data.OracleClient)


    【補足】

    SQL Server側サーバのODBC(64ビット)でOracleサーバをDNS設定してテスト接続してみたところ、接続できました。

    クライアントPCのAccessのクエリを実行することでデータをOracleからSQLServerへ流し込めることは確認できていますが、

    時間がかかりすぎるので、サーバ間で直接データを移したいと考えています。

    よろしくお願い致します。

    2015年5月26日 14:00

回答

  • こんにちは。

    SSISもSSMSも使用したことが無く恐縮ですが…。

    エラーメッセージからすると32bit, 64bitの問題のようなので以下からまず確認してみては如何でしょう。

    1. SSISまたはSSMSのプロセスは32bit, 64bitのどちらで動作していますか?
      もしこれが32bitであるのであれば、SQLServer側のOracle Clientも32bitにする必要があります。
    2. SQLServer側に64bitOracleをインストールする前に、32bit版のOracleをインストールした形跡はありますか?
      Oracleはインストールウィザードからのアンインストールからでは完全に削除できずフォルダやレジストリ、GACなどに旧バージョンが残り、悪さをすることが経験上あります。完全な削除を行ってみてください。

    検討違いかもしれませんけど…まず最初に確認するならば上記かなと思います。


    2015年5月26日 15:10
    モデレータ

すべての返信

  • こんにちは。

    SSISもSSMSも使用したことが無く恐縮ですが…。

    エラーメッセージからすると32bit, 64bitの問題のようなので以下からまず確認してみては如何でしょう。

    1. SSISまたはSSMSのプロセスは32bit, 64bitのどちらで動作していますか?
      もしこれが32bitであるのであれば、SQLServer側のOracle Clientも32bitにする必要があります。
    2. SQLServer側に64bitOracleをインストールする前に、32bit版のOracleをインストールした形跡はありますか?
      Oracleはインストールウィザードからのアンインストールからでは完全に削除できずフォルダやレジストリ、GACなどに旧バージョンが残り、悪さをすることが経験上あります。完全な削除を行ってみてください。

    検討違いかもしれませんけど…まず最初に確認するならば上記かなと思います。


    2015年5月26日 15:10
    モデレータ
  • Tak1waさん

    回答いただきありがとうございます。
    ご助言いただいたことを参考に、結果的に、接続できました。

    経緯をご報告します。

    まず、2ですが、64bitしかインストールしていませんでしたので、これが問題ではないと思いました。

    1ですが、確認したところ、SSIS、SSMSともに32bitで動作していました。
    そこで、ご助言の通り64bitのOracleClientを削除し、32bitのOracle Client 12cを入れなおし、あらためて下記1~3を試みました。


    1.SSISの接続マネージャで接続
    2.SSMSのデータベースのインポート(Microsoft OLE DB Provider for Oracle)
    3.SSMSのデータベースのインポート(.Net Framework Data Provider for Oracle)

    当初と同じ個所でエラーが出たのですが、共通して下記メッセージにかわりました。

    ~~~~~
    ORA-12504: TNS:リスナーはCONNECT_DATAのSERVICE_NAMEを取得できませんでした。
    (System.Data.OracleClient)
    ~~~~~

    この内容も理解できず困っていたところ、そういえば、ODBC接続(32bit)はできていたことを思い出し、
    SSIS接続マネージャで「OLEDBソース」ではなく、「ODBC入力元」を選び、ODBCドライバで登録
    しているデータソース名を選択することで接続ができました。

    なかなか原因と対応が分からず、しばらく悩んでいましたが、貴重なご意見をいただき大変助かりました。
    ありがとうございました。

    • 回答としてマーク wanderer2015 2015年5月27日 12:49
    • 回答としてマークされていない wanderer2015 2015年5月27日 12:49
    • 編集済み wanderer2015 2015年5月27日 12:50
    2015年5月27日 12:49
  • 先に進めたようで良かったですね。

    ORA-12504: TNS:リスナーはCONNECT_DATAのSERVICE_NAMEを取得できませんでした。

    このエラーが出たということは後はOracleClientでの接続設定ですね。
    SSISまたはSSMSからのOracleサーバへの接続指定方法はどのような方法をとっていますか。

    このエラーで多い原因はTnsNames.oraの内容不正です。
    SQLServer側のOracleでNetAssistantManagerからTNSの設定を行ってみてください。

    または以下を参考にTnsNames.oraの微妙な間違いを確認するとか。

    http://www.noguopin.com/oracle/index.php?ORA-12504

    #でもODBC接続でうまくいっているのであればそれで良いですね。

    2015年5月27日 13:08
    モデレータ
  • 追加のご助言ありがとうございます。

    SSISを例に挙げると、OLEDBソースでプロバイダーを「Microsoft OLE DB Provider for Oracle」としてサーバ名、ID、パスワードを入力しただけでした。というよりも、tnsnames.oraやその内容などを指定する画面がSSISで見当たらず、これではOracleDBとの接続に必要な情報を設定できていない気がします。。

    SSISで接続が成功したのも、プロバイダーをODBC接続に切り替え、あらかじめODBCドライバに登録したDNS設定を使用したため、ではないかと思います。

    なお、貼っていただいたリンク先を参照し、tnsnames.oraを一文字ずつ確認しましたが、問題は見つけられませんでした。

    ODBC接続では問題なくつながっていますで、SSIS,SSMSでの接続情報の設定が疑わしいかと思います。

    2015年5月28日 13:21
  • OLE DB で指定するのはtnsnames.oraで設定済みの接続識別子ではないのですかね?
    ※SSISだと違うとか…または私が勘違いしている…

    サーバ名、ID、パスワードを入力しただけでした
    Oracleサーバ側のリスナーポート名も上記の「サーバ名」で指定した感じでしょうか?
    2015年5月28日 13:45
    モデレータ