web-dev-qa-db-ja.com

.NETからOracleを使用するにはどうすればよいですか?

残念ながら、私は.NETからOracleを使用しようとしています。それは1997年に戻るようなものです。適切に説明することは弱点の兆候であり、レジストリー変数と環境変数が機能しているようです。

だからここに私がどこまで持っているかです。

Oracle.comで自分の生活についての巨大なフォームに記入し、

ODBC Windows 64ビットインスタンスクライアント、11.2.0.3.0、それをフォルダーに解凍します。 基本的なWindows 64ビットInstant Client、11.2.0.3.0を解凍し、上記と同じフォルダーに解凍します。

私はinstall .exeを実行しました(MSIなし、これは1997であることを覚えておいてください)。

ネットワーク共有の企業TNSNames.oraファイルを指すTNS_NAMES環境変数を追加し、コントロールパネルでクイックDSNを設定してテストを実行しました-動作しました!

次に、最新のODP.NET for .NET 4.0のXCOPYバージョンをダウンロードし、ソース管理ワークスペースの下のDependenciesフォルダーにコピーしました。

プロジェクトからの参照をDependencies\odp.net4\odp.net\bin\4\Oracle.DataAccess.dllに追加しました

管理されたODP.NETに、管理されていないOracleライブラリがどこにあるかを知らせる必要があると読みましたDependencies\odp.net4\bin\OraOps11w dllが他のOracleバイナリのどこかにある可能性はありますか?

ここで、DllPathという構成ファイルパラメータを設定しています。悲しいことに、Oracleのドキュメントでは、.NET構成ファイルにはconfigSectionsセクションに接続するセクションが必要であることを認識していないようです。

設定ファイルのセクションです。

<Oracle.dataaccess.client>
  <add key="DllPath" value="D:\Trunk\Dependencies\odp.net4\bin" />
</Oracle.dataaccess.client>

ConfigSectionには何が入っていますか?これで見つけたいくつかのスレッドは例を示しており、「type =が何であるかわからない」と言っています。これがメインビットです。

誰か私に助言できますか?誰かが.NETからOracleビューをクエリするためのダミーガイドへのリンクを知っていますか?

2012年にOracleを使用しなくて済むように1997年にできることはありますか?

[〜#〜]更新[〜#〜]

簡単な更新です。 OraOps11w.dllを出力binフォルダーにコピーし、以前に追加したweb.configファイルの変更をすべて削除しました。

現在、調査中の次のエラーが表示されます。

ファイルまたはアセンブリ 'Oracle.DataAccess'またはその依存関係の1つをロードできませんでした。不正な形式のプログラムを読み込もうとしました。

他のいくつかのフォーラムでは、Oracle.DataAccess.dllをGACに登録することについて話し合っています。これは避けたいと思っています-とにかく違いがどうなるかはわかりませんが、試してみることにします。

更新2

Oracle.DataAccess.dllライブラリをGACに登録しても違いはなく、登録を解除しました。

稼働週の終わりが近づいてきて、電車に乗らなければなりませんが、私はここに別の開発チームに電子メールを送り、彼らがこの戦いと戦ったことを願っています(他の人のように毎晩抽出を使用していません)。

更新3

今朝私はダウンロードしてセットアップしましたIIS 64ビットバージョンのExpress 8.0RC。64ビットバージョンはVS2010からサポートされていないため、コマンドラインから実行する必要があります。これはかなり単純ですが、タスクマネージャーで調べると、VSがiisexpress.exe * 32に使用するコマンドラインを確認できました。

残念ながら、64ビットIIS Expressでホストされているサイトにアクセスすると、このエラーが発生します。

ハンドラ「ExtensionlessUrl-Integrated-4.0」のモジュールリストに不正なモジュール「ManagedPipelineHandler」があります

これはこの問い合わせの行のはるか下にある問題なので、ODP.NETの32ビットバージョンを使用してみます。

UPDATE 4

32ビットバージョンのフルインストールをダウンロードしましたが、Oracle Universal Installerを見て怖くなりました。それは私の貴重な開発ボックスと信頼するにはあまりにも90年代に見えます。したがって、私は32ビットの「XCopy」クライアントを使用しています。これにより、サイトのホームページを表示できるので、参照が機能します。アーキテクチャの不一致32/64の問題を示唆してくれた方に感謝します。

現在、新しいOracleConnectionをインスタンス化するときにこのエラーを調べています。

プロバイダーは、Oracleクライアントのバージョンと互換性がありません

UPDATE 5私はそれをやったと思います。

そこで、32ビットの最新の11g "Instant Client"をダウンロードして、ソリューショントランクコードベースの\ Dependenciesフォルダーに配置しました。このフォルダーを%PATH%システム環境変数に追加し、そこにOraOps11w.dllファイルをチャッキングしました。

最後に、_oracleConnection = new OracleConnection(connectionString)はスローしません。次に、製品に展開する際に、机の上に1本のラフロイグがあることを確認する必要があります。

つまり、要約すると、IIS Express 7.5(32ビットプロセス))はWindows 7、64の場合:

  • 32ビット11g「インスタントクライアント」をダウンロードしてフォルダに抽出し、この場所をPATHに追加します。 Oci.dllは、メインのOracleクライアント側アンマネージライブラリです。

  • 32ビットODP.NETをダウンロードして、いくつかのフォルダーに抽出します。

  • OraOps11w.dllを、Instant Clientが存在するメインフォルダ(上記)にコピーします。

  • TNSNames.oraテキストファイルが存在するフォルダを指すTNS_ADMIN環境変数を追加します。これはhostsファイルのようなもので、Oracleサービス名をサーバーのホスト名にマップします。

  • Visual Studioを閉じてから再度開いて、新しい環境変数を確実に取得し、ODP.NETフォルダー内のOracle.DataAccess.dllマネージアセンブリへの参照を追加します。

それはそれであるはずです。方法を知っていると、かなり簡単に聞こえます。

アップデート5.1

ファイアウォールの問題であると確信していたため、最初に報告しなかった以下のエラーを調査します。私がいる会社には各ワークステーションに2つありますが、Oracleサーバーへのrawソケットを開いただけなので、開くことができません。

ORA-12541:TNS:リスナーがありません

26
Luke Puplett

この問題を説明する最も簡単な方法は、OracleクライアントとODACクライアントライブラリの違いを指摘することです。

64ビットマシン(Windows 7以降)では、64ビットのOracleクライアントをインストールする必要があります。これは、マシンにローカルにデプロイされているOracleデータベースへの接続にマシンが使用するクライアントです。 Webサーバーまたは他のターミナルサーバーでホストされているアプリの場合、ルールは同じです。

トリックはこれです...開発者として、私たちのマシンには.Net IDE toolingも必要です。Oracleには不適切な命名規則がありますが、基本的にODT(tooling)とODACの2つがあります。 (データアクセス)ODP.NetデータプロバイダーはODACライブラリの一部です。

IDEに戻ります... Visual Studioは32ビットであるため、上記のツールを32ビットでインストールする必要があります。

開発中、デバッグ中などに、VS.Netは32ビットのクライアントライブラリとデータアクセスライブラリを使用してOracleと連携します。

このアプリケーションをマシンにデプロイするとすぐに、特定のプラットフォームをターゲットにしない限り、マシンにロードされているクライアントが使用されます。

これは、32をターゲットにして64にデプロイすると、壊れる...逆も同様です。最善の方法は、任意のプラットフォームセクションに残し、単純に何をしているのかを覚えていることです。

注意すべきもう1つのことは、クライアントパッケージとODACパッケージの両方が同じバージョンであることを確認することです... 11g R2クライアントと11g R5 ODACを使用する必要はありません。デプロイするとすぐに、がらくたが再び壊れるからです。


ここでの警告は、アプリケーション内にOracleクライアントを「埋め込む」場合です。その場合、他のいくつかのライブラリと一緒にOraOpsがアプリケーションとともにデプロイされます。これはOracleのインスタントクライアントと呼ばれ、ODACパッケージの一部であり、含まれています。本格的なクライアントパッケージでも同様です。


良いニュース...

Oracleはまもなく(2013 Q1)次のODP.Netパッケージをリリースします...これはフルマネージドコードライブラリになります...一致する別のクライアントまたはODACパッケージはなくなり、プラットフォームは32を無視します64ビットの違い...古いMicrosoftライブラリと同じように機能し、より堅牢な機能セットを備えたOracleによって構築および保守されるだけです。早く届いたらいいのに。

5

Windows 7でOracleを接続するために過去に日間を費やしました。

私が遭遇した問題は、32ビットのOracle ODP.NETドライバーがインストールされた32ビットのASP.NETアプリケーションがあったことです。 ASP.NETアプリケーションが32ビットプロセスとして実行され、32ビットODP.NETが必要であっても、IISは64ビットプロセスであり、ODPが発生することを認識していませんでした。 .NETを使用して64ビットのレジストリキーにアクセスします。ASP.NET用にOracleをセットアップしようとしていたかどうかは言いませんでしたが、私の修正を共有します (ただし、Oracle 10.2のインストール用です)

my blog postからこの逐語訳をコピーしています)

注:これにより、Oracle 11.2.0.1は64ビット環境でのみ32ビットを使用します

私が最初に犯した間違いは、Windows 10にOracle 10gクライアントをインストールすることでした。これは機能しません。インストールした場合は、後でクリーンアップを実行する必要があります。

  • Oracleのサイトにアクセスして、11gの32ビットおよび64ビットクライアントをダウンロード/インストールします。
  • ここに移動 して、「ダミーレジストリエントリ」の手順に従います。
  • Regeditを開き、HKLM\SOFTWARE\Wow6432Node\Oracle\inst_locが適切な場所(おそらくC:\ Oracle\Inventory)を指していることを確認します
  • HKLM\SOFTWARE\Wow6432Node\Oracle\VOBHOME2.0のレジストリエントリが32ビットのOracleフォルダを指すようにします
  • Oracle_HOME環境変数を作成し、32ビットフォルダーを指すようにします。

これで、再起動後にすべての準備が整いました。

Oracle 10gクライアントをインストールしようとした場合は、クリーンアップを実行する必要があります。まず、Oracle 10gが完全にアンインストールされ、PATH変数から逆参照され、ディレクトリが削除されていることを確認します。次に、GACで参照されているアセンブリを見つけます。

gacutil /l | find /i "Oracle" > c:\[some directory]\Oracle.txt

Oracle.DataAccessバージョン10.2を参照する行を見つけて、GACから削除します。例として(同じバージョンがインストールされていない限り、これは機能しません):

gacutil /u "Oracle.DataAccess, Version=10.2.0.100, Culture=neutral, PublicKeyToken=89b483f429c47342"

これを行ったとき、3つのアセンブリを削除する必要がありました。

  1. Oracle.DataAccess
  2. Policy.10.1Oracle.DataAccess
  3. Policy.9.2.Oracle.DataAccess

繰り返しますが、おそらく再起動する必要があります(Windowsです)。


クリーンアップを実行する必要がある場合は、私も それについてブログに書いてあります

参考のために
「ダミーレジストリエントリ」ステップへのリンクが機能しなくなった場合のガディによる投稿のテキストは次のとおりです。

"" こんにちは、ベン、

設計時、SQL Serverビジネスインテリジェンス開発スタジオを使用する場合、Oracle Connectorは32ビットモードで実行されているため、32ビットのOracleクライアントをロードします。

最も可能性が高いのは、コネクターが間違ったOracleクライアント(oci.dll)をロードしているためにエラーが発生していることです。TNSサービスが定義されていません。

この問題を解決するには、2つのオプションがあります。

  1. Oracle接続マネージャーエディターでTNSサービス名の代わりにOracle接続文字列を、たとえば次の形式で指定します。Host:port/service_name

  2. 次のようにダミーのレジストリエントリ(Z_SSIS)を定義します。

    • Regeditユーティリティを開きます。
    • 次のキーを見つけます:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Oracle
    • Oracleノードを右クリックし、[新規]-> [キー]をクリックします。
    • 新しいキーZ_SSISを呼び出します(それが最後のエントリであることを確認するため)。
    • Z_SSISノードを右クリックし、[新規]-> [文字列]をクリックします。
    • プロパティにOracle_HOMEという名前を付けます。
    • Oracle_HOMEをダブルクリックして、使用するOracle 32Bitインストールホームディレクトリの場所に設定します。

よろしく、

ガディ ""

3
Jim Schubert

これが道の問題だとは思いません。 "不正な形式でプログラムをロードしようとしました。"は、ほとんどの場合、32ビットと64ビットのアセンブリとDLLを混在させていることを示すエラーです。ネット。

64ビットのOracleクライアントをインストールしたようですが、DSNの作成が機能して以来、64ビットバージョンのOSを使用していると思いますか?あなたの問題は、いくつかの関連するシナリオに起因する可能性があります:

  • OraOps11w.dllのコピーが32ビットアセンブリである可能性があり、それを64ビットアプリで使用している
  • OraOps11w.dllのコピーが64ビットアセンブリである可能性があり、32ビットアプリから使用しようとしている
  • oracle Data Provider for .NETの管理されていない依存関係の1つが32ビットであり、32ビットアプリにロードできません(またはその逆)

アプリが特にx86をターゲットにしている場合、基盤となるOSプラットフォームに関係なく、32ビットのOracleクライアントパッケージをインストールする必要があると思います(たとえば、64ビットを使用している場合でも、32ビットのアプリには32ビットのOracleクライアントが必要です。ビット版のWindows)

チェックする2つのこと:

  • Oracleプロバイダーを呼び出すアセンブリの「プラットフォームターゲット」設定を確認します。x64は常に64ビットとして実行しようとし、x86は常に32ビットとして実行しようとし、「任意のプラットフォーム」はターゲットOSアーキテクチャにJITコンパイルします実行時(x86システムでは32ビット、x64システムでは64ビット)
  • corflags.exeを介してOraOps11w.dllを実行します(詳細を参照これはSO post)32ビット、64ビット、または「任意のCPU」かどうかを確認します

最後に、Oracle用の組み込み.NETデータプロバイダーを試しましたか(System.Data.OracleClient名前空間?)

アプリのプロジェクト設定について詳しく知らないので、これが私ができる最善の方法です。

1
Mike Marshall

まず、Oracleへの純粋な愛を+1し、彼らが最高の製品を提供する最高の会社であることを認識しましょう! ;)


ええ、ダウンロードとインストールのプロセスはばかげています。私は通常、自分のサイトで適切なクライアントのダウンロードすら見つけることができません。OracleUniversal Product Installerはひどいです。


OraOps11w.dllディレクトリに\binのコピーが必要になる場合があります。時々そうではない。必要なときと必要でないときはわかりませんが、参照されているOracle.DataAccess.dll正確にインストールされているOracleクライアントと同じバージョンでない場合、 OraOps11w.dllが必要です。


DllPathを使用して、設定ファイルで何をしようとしているのか説明できますか? Oracleのインストールでは、.NETランタイムのmachine.configに必要なほぼすべてのものが登録されているはずです。 ODP.NETをセットアップしてからしばらく経ちましたが、接続文字列以外にapp.configに追加するものがあることを覚えていません。

1
CodingWithSpike