はじめまして。
ネットで色々調べたのですが、見つけられずコチラに書かせて頂きます。
やりたいことは、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(
> (LFile 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ビット機の違いに何か問題があるのでしょうか。。
宜しくお願い致します。
その msado15.dll は 32bit 用ですよね。
作っているアプリは 64bit 用ですか?
64bit アプリで 32bit DLL を読み込むことはできません。
アプリを 32bit 版にするか、64bit 版の DLL を用意する必要があります。
ご返答ありがとうございます!
>作っているアプリは 64bit 用ですか?
64bit用です。
64bit版のDLLは、
「C:\Program Files (x86)\Common Files\System\ado\msado15.dll」
かと思っていますが、違ってましたか?
x86フォルダの方は通常32bit版のプログラムが格納されるはずです。
64bit版のDLLは
C:\Program Files\Common Files\System\ado\msado15.dll
というのがありませんか?
x86フォルダではないんですね。
「C:\Program Files\Common Files\System\ado\msado15.dll」
がありましたので、コチラに置き換えて実行してみましたが
結果は同じエラーでした。。
「64bit」と「_ConnectionPtr」や「CreateInstance」で検索していますが、
全くヒットしないです…。
64ビット機でのDB接続は、また違う方法なのでしょうか??
x86でなくX64・IA64では?
また、64BIT版は、INTEL版とAMD版とインストール方法が違う場合がありましたよね。
ADOもその可能性はないですか?
あと、ぐぐっていると、64BIT版は、ADO_NET2.0以降対応って記事もありました。
もう少し、調べてみてはいかがでしょうか?
エラーの発生箇所を考えるとADOというよりデータプロバイダの方の問題かもという気が
します。
> __uuidof( Connection )
がどういう値になるかをまず調べてください。
そして、レジストリの HKEY_CLASSES_ROOT \ CLSID 下にそれがなければ、
RegSvr32.exe msado15.dll
とやって、DLL を登録してみてください。
返事が遅れて申し訳ありません。。
>>__uuidof( Connection )
>がどういう値になるかをまず調べてください。
デバックして「>>__uuidof( Connection )」見ると
「エラーです:シンボル Connectionが見つかりません」
と出ます。
ちなみに
「m_pConnection」を見ると、アドレスのような値です。
「hr」を見ると、「S_OK」です。
値を見るというのは、こういう方法で良いですか?
えーと。
アドバイスに関してどうしてそういうアドバイスを受けたのか
まで考えてみてください。
__uuidof( Connection )は何を得るマクロなんでしょう?
CreateInstanceの引数として引き渡している意味は何でしょう?
この辺を理解すれば、自分が受けたアドバイスの意味がある程度わかると思います。
system.udlのプロバイダーは「Oracle Provider for OLE DB」で
OracleDBへの接続時に、try~catchで確認したところ、
「プロバイダーが見つかりません。正しくインストールされていない可能性がありま
す。」
というエラーでした。
試しで、ODBCを設定し
system.udlのプロバイダーを「Microsoft OLE DB Provider for ODBC Drivers」で確認
してみると
「指定された DSN には、ドライバーとアプリケーションとのアーキテクチャの不一致が
含まれています」
というエラーでした。
接続方法というよりも、oracleDB自体に何か設定が必要なのでしょうか?
Oracle Client 及び Oracle Provider for OLE DB は64bit版ですか?
Oracle Clientは「OracleClient11g_home1」の64bit版で、DBも64bit版です。
データプロバイダーの方も64bitでアクセスできないなら
実はアプリ側が32bitのままという可能性はないでしょうか。
VS2008の既定の設定では64ビット機でも32bitのバイナリを吐きますが、
プラットフォームをx64に変更してからコンパイルしていますか?
ちなみに実行中のアプリケーションが32bitか64bitかは
タスクマネージャーのプロセスタブを見ればわかります。
> プラットフォームをx64に変更してからコンパイルしていますか?
!!
ご指摘のとおりに実行したらDB接続が成功しました!
64bit機にインストールされたVisualStudio2008でコンパイルすれば
64bit版のプロセスが生成されるとばかり思っていました。
大変助かりました。
subaru様はじめ、返信していただいた方々ありがとうございました。