VC2008でOracleDB接続エラー

[戻る]
あゆしお 2010/06/16(水) 20:57:58
はじめまして。
ネットで色々調べたのですが、見つけられずコチラに書かせて頂きます。

やりたいことは、VisualStudio2008(C++)で
Windows2008ServerにあるOracleDb11gのテーブルを
Windows7(64ビット機)の端末からアクセスし、編集したいのです。

WindowsXP(32ビット機)端末では、

 > #define INITGUID
 > #import "C:\Program Files\Common Files\System\ADO\msado15.dll" 
rename_namespace("ADOCG") rename("EOF", "adoEOF")
 > using namespace ADOCG;
 > #include "icrsint.h"

と定義(?)して、

 > HRESULT         hr;
 > _ConnectionPtr      m_pConnection;
 >
 > hr = m_pConnection.CreateInstance( __uuidof( Connection ) );
 > if( SUCCEEDED(hr) ){
 >     hr = m_pConnection->Open(
 >                             (L"File Name=C:\\system.udl;"),
 >                             (L""),
 >                             (L""),
 >                             adModeUnknown);

を実行すると正常に接続でき、テーブルの編集もできます。


Windows7(64ビット機)端末では、「msado15.dll」のファイルパスが違うので、

 > #import "C:\Program Files (x86)\Common Files\System\ado\msado15.dll" 
rename_namespace("ADOCG") rename("EOF", "adoEOF")

と修正して実行してみると、「クラスが登録されていません」のエラーダイアログが表
示されます。
エラー箇所は「m_pConnection->Open(...)」です。
「C:\\system.udl」自体の接続確認は正常にできているのですが。。


32ビット機と64ビット機の違いに何か問題があるのでしょうか。。
宜しくお願い致します。

aetos 2010/06/18(金) 11:37:27
その msado15.dll は 32bit 用ですよね。
作っているアプリは 64bit 用ですか?
64bit アプリで 32bit DLL を読み込むことはできません。
アプリを 32bit 版にするか、64bit 版の DLL を用意する必要があります。

あゆしお 2010/06/18(金) 13:04:31
ご返答ありがとうございます!

>作っているアプリは 64bit 用ですか?
64bit用です。

64bit版のDLLは、
「C:\Program Files (x86)\Common Files\System\ado\msado15.dll」
かと思っていますが、違ってましたか?

subaru 2010/06/18(金) 15:42:41
x86フォルダの方は通常32bit版のプログラムが格納されるはずです。
64bit版のDLLは
C:\Program Files\Common Files\System\ado\msado15.dll
というのがありませんか?

あゆしお 2010/06/18(金) 20:29:15
x86フォルダではないんですね。

「C:\Program Files\Common Files\System\ado\msado15.dll」
がありましたので、コチラに置き換えて実行してみましたが
結果は同じエラーでした。。

「64bit」と「_ConnectionPtr」や「CreateInstance」で検索していますが、
全くヒットしないです…。
64ビット機でのDB接続は、また違う方法なのでしょうか??

ITO 2010/06/18(金) 21:20:14
x86でなくX64・IA64では?
また、64BIT版は、INTEL版とAMD版とインストール方法が違う場合がありましたよね。
ADOもその可能性はないですか?
あと、ぐぐっていると、64BIT版は、ADO_NET2.0以降対応って記事もありました。
もう少し、調べてみてはいかがでしょうか?

subaru 2010/06/19(土) 00:56:54
エラーの発生箇所を考えるとADOというよりデータプロバイダの方の問題かもという気が
します。

aetos 2010/06/19(土) 01:16:40
> __uuidof( Connection )

がどういう値になるかをまず調べてください。

そして、レジストリの HKEY_CLASSES_ROOT \ CLSID 下にそれがなければ、
RegSvr32.exe msado15.dll
とやって、DLL を登録してみてください。

あゆしお 2010/06/22(火) 17:17:30
返事が遅れて申し訳ありません。。

>>__uuidof( Connection )
>がどういう値になるかをまず調べてください。

デバックして「>>__uuidof( Connection )」見ると
「エラーです:シンボル "Connection"が見つかりません」
と出ます。
ちなみに
「m_pConnection」を見ると、アドレスのような値です。
「hr」を見ると、「S_OK」です。

値を見るというのは、こういう方法で良いですか?

PATIO 2010/06/22(火) 18:48:16
えーと。

アドバイスに関してどうしてそういうアドバイスを受けたのか
まで考えてみてください。

__uuidof( Connection )は何を得るマクロなんでしょう?

CreateInstanceの引数として引き渡している意味は何でしょう?

この辺を理解すれば、自分が受けたアドバイスの意味がある程度わかると思います。

あゆしお 2010/06/24(木) 15:54:46
system.udlのプロバイダーは「Oracle Provider for OLE DB」で
OracleDBへの接続時に、try〜catchで確認したところ、
「プロバイダーが見つかりません。正しくインストールされていない可能性がありま
す。」
というエラーでした。

試しで、ODBCを設定し
system.udlのプロバイダーを「Microsoft OLE DB Provider for ODBC Drivers」で確認
してみると
「指定された DSN には、ドライバーとアプリケーションとのアーキテクチャの不一致が
含まれています」
というエラーでした。

接続方法というよりも、oracleDB自体に何か設定が必要なのでしょうか?

subaru 2010/06/24(木) 16:21:45
Oracle Client 及び Oracle Provider for OLE DB は64bit版ですか?

あゆしお 2010/06/24(木) 17:56:19
Oracle Clientは「OracleClient11g_home1」の64bit版で、DBも64bit版です。

subaru 2010/06/25(金) 10:52:53
データプロバイダーの方も64bitでアクセスできないなら
実はアプリ側が32bitのままという可能性はないでしょうか。

VS2008の既定の設定では64ビット機でも32bitのバイナリを吐きますが、
プラットフォームをx64に変更してからコンパイルしていますか?

ちなみに実行中のアプリケーションが32bitか64bitかは
タスクマネージャーのプロセスタブを見ればわかります。

あゆしお 2010/06/25(金) 20:26:02
[[解決]]
> プラットフォームをx64に変更してからコンパイルしていますか?

!!

ご指摘のとおりに実行したらDB接続が成功しました!

64bit機にインストールされたVisualStudio2008でコンパイルすれば
64bit版のプロセスが生成されるとばかり思っていました。

大変助かりました。
subaru様はじめ、返信していただいた方々ありがとうございました。

古いスレッドには追加発言できません。