Access 資料庫設定密碼後,ADO 連線字串必須包含 Jet OLEDB:Database Password=你的密碼 參數,否則會報錯「無法開啟資料庫」。
CString strSql;
TCHAR FileName[MAX_PATH], errMsg[MAX_PATH];
::CoInitialize(NULL); // 初始化 COM
IADORecordBinding* picRs = NULL;
_RecordsetPtr pRs("ADODB.Recordset");
_ConnectionPtr pConn("ADODB.Connection");
// 取得專案目錄下的 pass.mdb
GetModuleFileName(NULL, FileName, MAX_PATH);
(_tcsrchr(FileName, _T('\\')))[1] = _T('\0');
lstrcat(FileName, _T("pass.mdb"));
// 組裝連線字串(含密碼)
strSql = _T("Provider=Microsoft.Jet.OLEDB.4.0;");
strSql += _T("Data Source=") + CString(FileName) + _T(";");
strSql += _T("Persist Security Info=False;");
strSql += _T("Jet OLEDB:Database Password=cd;"); // 密碼為 "cd"
CString sqlSentence = _T("SELECT * FROM pass");
try
{
// 開啟連線
pConn->Open((_bstr_t)strSql, _T(""), _T(""), adModeUnknown);
// 可選:取得 RecordBinding 介面
pRs->QueryInterface(__uuidof(IADORecordBinding), (LPVOID*)&picRs);
// 開啟記錄集
pRs->Open((_variant_t)sqlSentence,
pConn.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch (_com_error& e)
{
sprintf(errMsg, _T("連線失敗:%s"), (char*)e.ErrorMessage());
AfxMessageBox(errMsg);
pRs->Close();
pConn->Close();
::CoUninitialize();
return;
}
try
{
while (!(pRs->EndOfFile))
{
CString pass = (LPCTSTR)(_bstr_t)pRs->GetCollect(_T("pass"));
if (pass.IsEmpty()) return;
SetDlgItemText(IDC_PASS, pass); // 顯示於對話框編輯框
pRs->MoveNext();
}
pRs->Close();
pConn->Close();
}
catch (_com_error& e)
{
sprintf(errMsg, _T("讀取失敗:%s"), (char*)e.ErrorMessage());
AfxMessageBox(errMsg);
pRs->Close();
pConn->Close();
::CoUninitialize();
return;
}
::CoUninitialize();
| 項目 | 說明 |
|---|---|
| Provider | Microsoft.Jet.OLEDB.4.0(Access 2000/2003) |
| 密碼參數 | Jet OLEDB:Database Password=xxx |
| Persist Security Info | 建議 False,避免連線字串洩露密碼 |
| 記錄集開啟模式 | adOpenDynamic + adLockOptimistic 適合一般讀寫 |
| 欄位取值 | pRs->GetCollect(_T("欄位名")) 配合 _bstr_t 轉 CString |
| 錯誤處理 | 捕捉 _com_error,呼啟 ErrorMessage() 取得詳細描述 |
msado15.dll 版本、MDAC 安裝完整、Access 檔案未損壞。.accdb) 請改用 Microsoft.ACE.OLEDB.12.0 Provider。掌握帶密碼連線字串格式與完整錯誤處理流程,即可在 VC++ 中安全存取受保護的 Access 資料庫。