ADOを用いてAccessファイルに接続する – プログラミング – Home

ADOを用いてAccessファイルに接...
 
通知
すべてクリア

[解決済] ADOを用いてAccessファイルに接続する


田中さん
 田中さん
(@田中さん)
ゲスト
結合: 19年前
投稿: 49
Topic starter  

開発環境[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();
}
}

}


引用未解決
トピックタグ
モーヲタ
 モーヲタ
(@モーヲタ)
ゲスト
結合: 18年前
投稿: 21
 

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


返信引用
田中さん
 田中さん
(@田中さん)
ゲスト
結合: 19年前
投稿: 49
Topic starter  

ありがとうございます。
早速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
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

CoInitializeが抜けているとか。


返信引用
田中さん
 田中さん
(@田中さん)
ゲスト
結合: 19年前
投稿: 49
Topic starter  

Blueさんありがとうございました。
ご指摘の通りCoInitialize()が抜けていました。
COMは初期化と終了が必要なのですね。

tryの前に

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

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

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

を付け加えました。

以上解決しました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました