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

VC++ 6.0 使用 ADO 存取 Access 資料庫範例

     編輯:VC 教學

前言

ActiveX Data Objects (ADO) 是微軟提供的高階資料存取介面,配合 #import 指令可在 VC++ 中以智慧型指標輕鬆操作 Access、SQL Server 等資料來源。本文提供一個最小化的主控台/視窗程式範例,示範連接 .mdb、執行 SQL 查詢、讀取欄位值並以訊息框顯示結果。

完整原始碼

#include <windows.h>
#include <stdio.h>
#import "C:/Program Files/Common Files/System/ado/msado15.dll" \
        no_namespace rename("EOF", "adoEOF")

HRESULT ComInit()
{
    HRESULT hr = CoInitialize(NULL);
    if (FAILED(hr))
    {
        CoUninitialize();
        return E_UNEXPECTED;
    }
    return hr;
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR lpCmdLine,
                     int nCmdShow)
{
    if (FAILED(ComInit())) return -1;

    try
    {
        _ConnectionPtr pConn(__uuidof(Connection));
        _RecordsetPtr pRs(__uuidof(Recordset));

        // 開啟 Access 資料庫
        pConn->Open(
            L"Provider=Microsoft.Jet.OLEDB.4.0;"
            L"Data Source=C:\\VCADO\\users.mdb;",
            L"", L"", adConnectUnspecified);

        if (pConn->State == adStateClosed)
        {
            MessageBoxW(NULL, L"資料庫連接失敗", L"錯誤", MB_OK | MB_ICONERROR);
            CoUninitialize();
            return 0;
        }

        // 執行查詢
        _variant_t sql(L"SELECT * FROM 用戶信息表");
        pRs->Open(sql, pConn.GetInterfacePtr(),
                  adOpenStatic, adLockOptimistic, adCmdText);

        if (pRs->RecordCount > 0)
        {
            pRs->MoveFirst();
            _variant_t val = pRs->Fields->GetItem(L"姓名")->Value;
            _bstr_t name(val);
            wchar_t msg[256];
            swprintf_s(msg, L"查詢成功:%s", (wchar_t*)name);
            MessageBoxW(NULL, msg, L"結果", MB_OK | MB_ICONINFORMATION);
        }
        else
        {
            MessageBoxW(NULL, L"查無資料", L"提示", MB_OK | MB_ICONINFORMATION);
        }

        pRs->Close();
        pConn->Close();
    }
    catch (_com_error &e)
    {
        MessageBoxW(NULL, e.ErrorMessage(), L"ADO 錯誤", MB_OK | MB_ICONERROR);
    }

    CoUninitialize();
    return 0;
}

關鍵技術點

  1. 連接字串:使用 Microsoft.Jet.OLEDB.4.0 Provider 針對 Access 2000/2003 (.mdb);Access 2007+ (.accdb) 請改用 Microsoft.ACE.OLEDB.12.0。
  2. 智慧型指標:_ConnectionPtr、_RecordsetPtr 自動管理 AddRef/Release,例外發生時也能正確釋放資源。
  3. _variant_t 與 _bstr_t:封裝 VARIANT/BSTR 操作,支援隱含轉型,程式碼更簡潔安全。
  4. 游標與鎖定類型:範例採 adOpenStatic + adLockOptimistic,適合唯讀或少量更新;大量資料建議 adOpenForwardOnly + adLockReadOnly 以節省記憶體。

常見問題排查

  • 「找不到提供者」錯誤:確認目標機器已安裝 MDAC 2.8+ 或 Access Database Engine(64 位元環境需安裝 64 位元版本)。
  • 路徑含空白/中文:連接字串中的路徑請用單引號包裹或確保雙反斜線跳脫。
  • 64 位元專案無法編譯:msado15.dll 為 32 位元,64 位元專案請改用 msado60.tlb 或安裝 64 位元 ACE Provider 並調整連接字串。

進階延伸

  • 參數化查詢:使用 Command 物件搭配 Parameters 集合防止 SQL Injection。
  • 交易處理:BeginTrans/CommitTrans/RollbackTrans 確保資料一致性。
  • 斷線重連:封裝連線邏輯為可重入函式,搭配連線池提升效能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved