こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VB.NET Oracle接続 32、64bit

VB.NET 2010でOracle11gに接続するプログラムを作っていますが、
接続方法がいまいちわからずに困っています。

プログラムを動かすサーバーはWindows Server 2008 R2の64bitだったので、
Oracle Clientも合わせた方がいいのかなと思い、64bit版をインストールしました。

ASP.NETのWEBアプリでは以下の接続文字列を用いてADO接続できました。
パラメータ値は例です。
(Web.configに記述)
<connectionStrings>
<add name="oracle" connectionString="Provider=OraOLEDB.Oracle;Data Source=db1;Password=pass1;User ID=user1"
providerName="System.Data.OleDb" />
</connectionStrings>


次に、コンソールプログラムを作成し、同じサーバーで上記と同様の接続文字列で
接続しようとしましたが、エラーとなり接続できませんでした。

いろいろ記述を変えても接続できませんでしたが、最終的にOracle Clientの
32bit版を64bit版と違うフォルダにインストールし、以下の接続文字列で接続
できました。(INIファイルに記載)
ConnectionString=Provider=OraOLEDB.Oracle;Data Source=db1;Password=pass1;User ID=user1

この状態でWEBアプリの方は何を使っているのかと思い、64bit版のインストールフォルダを
リネームしたところ、WEBアプリの方は接続できなくなりました。


現状では32bitと64bitのOracle Clientが両方必要な状況ですが、本来ならどちらかだけで
すむと思います。
32bitと64bitで接続文字列が変わるという情報は得られませんでした。
何がまずいのでしょうか?
最初から32bit版をインストールすれば良かったのでしょうか。

投稿日時 - 2014-01-08 11:12:42

QNo.8420174

すぐに回答ほしいです

質問者が選んだベストアンサー

先ず、大前提として32bitプログラムのプロセス空間には
32bitのDLLしかロードできません。同様に64bitのそれは
64bitのDLLしかロードできません。
OLEの実装にはDLL型とEXE型があり、前者は同一の
プロセス空間にあるため、32bitプログラムからは32bitの、
64bitプログラムからは64bitのDLL実装でなければ動き
ません。

OLEをインスタンス化する時に使うクラス名はレジストリに
登録されており、最終的に処理を担うDLLかEXEのパスに
行き着くようになっています。互換性を保つため、クラス名は
以前から変わっていませんし、32/64の区別もありません。
OracleのOLEはDLL型実装なので、32bitか64bitのどちらか
一方しか処理できません。

ここでは”OraOLEDB.Oracle”が示す最終パスは後から
インストールした方に切り替えられているはずです。
サーバが64bitなら、64bit版で統一すべきでしょう。
32bit版をアンインストールして、もう一度、64bit版を
インストールした方がよいでしょう。
そして、コンソールプログラムの方を64bit版でリビルドする
ことを薦めます。Visual Studio 2012ならどちらでもビルド
できます。

投稿日時 - 2014-01-08 20:44:56

補足

基礎からの詳しいご回答ありがとうございます。
非常に勉強になります。
まず64bitでビルドする方法を改めて調べて、それができたら
64bitのOracle Clientの状態だけにして試してみたいと思います。

投稿日時 - 2014-01-09 08:45:55

お礼

ご指摘の通りでした。
32bit版をアンインストール(Deinstall.batを使用)すると、コンソールアプリだけでなく、
WEBアプリも接続できなくなりました。

64bit版も同様にアンインストールし、再度インストールしました。

コンソールアプリケーションをサーバーのVisualStudioで64bitでビルドし
接続できました。
WEBアプリでも接続できました。

現在は64bit版だけで動く状態になりました。

ありがとうございました。

投稿日時 - 2014-01-09 16:35:46

ANo.2

このQ&Aは役に立ちましたか?

16人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

.NETのコンソールプログラムは64bitビルドです?

投稿日時 - 2014-01-08 11:52:12

補足

ご回答ありがとうございます。
開発機がWin7の32bitなので、ビルドも32bitです。
それも思い当たって、サーバのVisualStudioで一応64bitビルドをしてみたつもりでしたが、
改善できませんでした。

投稿日時 - 2014-01-08 12:10:24

お礼

もういちど64bitでビルドするよう調べてみます。
ありがとうございます。

投稿日時 - 2014-01-09 08:43:43