首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ ADO 連線受密碼保護的 Access 資料庫完整範例

     編輯:VC 教學

連線字串關鍵:Jet OLEDB:Database Password

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();

關鍵點總結

項目說明
ProviderMicrosoft.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 檔案未損壞。
  • 密碼錯誤:檢查連線字串大小寫、分號分隔、密碼是否包含特殊字元(需逸出)。
  • 多使用者並存:Jet 引擎適合少量並發,高併發請遷移至 SQL Server (SQLOLEDB)。

安全建議

  • 避免在程式碼中硬編碼密碼,改用加密設定檔或 Windows 儲存憑證。
  • Access 2007+ (.accdb) 請改用 Microsoft.ACE.OLEDB.12.0 Provider。
  • 生產環境建議使用 SQL Server Express + Windows 整合驗證,免除密碼管理。

掌握帶密碼連線字串格式與完整錯誤處理流程,即可在 VC++ 中安全存取受保護的 Access 資料庫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved