ADOを用いてAccessファイルに接続する

[戻る]
田中さん 2007/02/04(日) 19:11:59
開発環境[VisualC++.Net WindowsXP-SR1 SDK開発]

お世話になります。
VisualC++でADOよりAccessファイルに接続するプログラムを作成しています。
そこで、Accessファイルに接続するプログラムを作っていますが、
「HC_TapeLabel.exe の 0x7c812a5b でハンドルされていない例外が発生しました : 
Microsoft C++ exception: _com_error @ 0x0012ebe0。」というエラーが出て接続できま
せん。おそらく接続文字に不備があると思うのですが解決方法が分からず困っています。

MSDNを参考にし、考えたプログラムを以下に載せますがどのあたりがおかしいのでしょう
か?


/////////////////////////////////////////
//      AccessDBのバージョンを取得する関数
/////////////////////////////////////////
void db_access::GetDBVersionX(){
HRESULT         hr=S_OK ;
_bstr_t strCnn("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\testlist.mdb;");
_ConnectionPtr    pConnection     = NULL;

//メッセージ
char szStrBuff[128];
memset(szStrBuff,0,sizeof(szStrBuff));
try
{
//オープンコネクション
TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
pConnection->Open (strCnn, "", "", 0);
wsprintf(szStrBuff,"ADO Version   : %s\n\n", (LPCSTR) pConnection->Version);
MessageBox(NULL,szStrBuff,"ADOバージョン表示",MB_OK);
wsprintf(szStrBuff,"DBMS Name   : %s\n\n",(LPCSTR) (_bstr_t)
pConnection->Properties->GetItem("DBMS Name")->Value);
MessageBox(NULL,szStrBuff,"ADOバージョン表示",MB_OK);

}catch (_com_error &e){
//エラー処理
PrintProviderError(pConnection);
PrintComError(e);
}

//DB切断処理
if (pConnection){
if (pConnection->State == adStateOpen){
pConnection->Close();
}
}

}

モーヲタ 2007/02/04(日) 21:24:52
>_bstr_t strCnn("Provider=Microsoft.Jet.OLEDB.4.0;Data 
Source=C:\testlist.mdb;");
MDBファイルのパスは
C:\testlist.mdb
ではなく
C:\\testlist.mdb
しないとエスケープ文字として"\"マークが認識できません。

田中さん 2007/02/05(月) 01:35:06
ありがとうございます。
早速C:\\testlist.mdbと変えましたがやはりダメです。
正確なログが出ないのですが、pConnection->Open (strCnn, "", "", 0);
で失敗しているようです。
となると接続文字が不適合か、Openの引数がおかしいのでしょうか?

止まっている所はcomip.hの以下の場所です。

    Interface* operator->() const 
    { 
        if (m_pInterface == NULL) {
            _com_issue_error(E_POINTER);
        }

       return m_pInterface;←ここで止まっている。 
    }

Blue 2007/02/05(月) 07:08:16
CoInitializeが抜けているとか。

田中さん 2007/02/05(月) 16:17:43
[[解決]]
Blueさんありがとうございました。
ご指摘の通りCoInitialize()が抜けていました。
COMは初期化と終了が必要なのですね。

tryの前に

//ポインタの初期化を行う。
CoInitialize(NULL);            

を付け加え、pConnection->Close();をした後に

//comライブラリのクローズ!!ADOを使用した処理が全て終了
CoUninitialize();   

を付け加えました。

以上解決しました。

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