26

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

これが私が持っている距離です。

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

ODBC Windows 64 ビット インスタンス クライアント、11.2.0.3.0をフォルダーに解凍します。 Basic Windows 64-bit 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 ライブラリを見つけることができる場所を知らせる必要があることを読みましたどこか?

ここで、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 を出力ビン フォルダーにコピーし、以前に追加した web.config ファイルの変更をすべて削除しました。

現在、次のエラーが発生しています。これについては調査中です。

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

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

更新 2

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

今週の仕事が終わり、電車に乗らなければなりませんが、ここで別の開発チームにメールを送り、彼らが以前にこの戦いを戦ったことを願っています (そして、他の人のように毎晩の抽出を使用していないことを願っています)。

更新 3

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

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

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

これは、この調査の範囲を超えた問題であるため、ODP.NET の 32 ビット バージョンを使用してみます。

更新 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) はスローしません! 今、本番環境にデプロイするときは、机の上にラフロイグのボトルがあることを確認する必要があります。

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

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

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

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

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

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

それだけです。方法を知っていれば、かなり簡単に聞こえます。

アップデート 5.1

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

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

4

5 に答える 5

5

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

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

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

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

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

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

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

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


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


良いニュース...

Oracle は間もなく (2013 年第 1 四半期)、次の ODP.Net パッケージをリリースします...これは完全に管理されたコード ライブラリになります...つまり、個別のクライアントまたは ODAC パッケージが一致する必要がなくなり、プラットフォームは 32 を認識しなくなります。そして64ビットの違い...古いMicrosoftライブラリと同じように機能しますが、より堅牢な機能セットを備えたオラクルによって構築および維持されるだけです。早く届くことを願うばかりです。

于 2012-11-20T00:50:57.740 に答える
3

私は過去に、Windows 7 で Oracle を接続しようと何日も費やしてきました。

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

(私はブログ投稿からこの言葉をそのままコピーしています)

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

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

  • Oracle のサイトにアクセスし、11g 32 ビットおよび 64 ビット クライアントをダウンロードしてインストールします。
  • ここに移動して、「ダミー レジストリ エントリ」の手順に従います。
  • regedit を開きHKLM\SOFTWARE\Wow6432Node\ORACLE\inst_loc、適切な場所 (おそらく C:\oracle\Inventory) を指していることを確認します。
  • レジストリ エントリをHKLM\SOFTWARE\Wow6432Node\ORACLE\VOBHOME2.032 ビットの 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.1.Oracle.DataAccess
  3. Policy.9.2.Oracle.DataAccess

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


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

参考
までに、「ダミーのレジストリ エントリ」手順へのリンクが無効になった場合に備えて、Gadi によるその投稿のテキストを次に示します。

"" こんにちは、ベン、

設計時に SQL Server Business Intelligence Development Studio を使用する場合、Oracle コネクタは 32 ビット モードで実行されているため、32 ビットの Oracle クライアントが読み込まれます。

ほとんどの場合、TNS サービスが定義されていない間違った Oracle クライアント (oci.dll) をコネクタがロードしているため、エラーが発生しています。

この問題を解決するには、次の 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 インストール ホーム ディレクトリの場所に設定します。

よろしく、

ガディ「」

于 2012-07-06T19:06:42.990 に答える
1

まず、オラクルへの純粋な愛情のために+1し、彼らが最高の製品を備えた最高の会社であることを認識してください!;)


ええ、ダウンロードとインストールのプロセスはばかげています。私は通常、彼らのサイトで適切なクライアントのダウンロードを見つけることさえできず、Oracle UniversalProductInstallerのことはひどいものです。


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


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

于 2012-07-06T17:20:53.457 に答える
1

これはパスの問題ではないと思います。 「不正な形式のプログラムを読み込もうとしました。」は、ほとんどの場合、.NET で 32 ビットと 64 ビットのアセンブリと DLL が混在していることを意味するエラーです。

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

  • 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 のビット版)

確認するいくつかのこと:

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

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

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

于 2012-07-06T18:47:56.620 に答える