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;
}
Microsoft.Jet.OLEDB.4.0 Provider 針對 Access 2000/2003 (.mdb);Access 2007+ (.accdb) 請改用 Microsoft.ACE.OLEDB.12.0。_ConnectionPtr、_RecordsetPtr 自動管理 AddRef/Release,例外發生時也能正確釋放資源。adOpenStatic + adLockOptimistic,適合唯讀或少量更新;大量資料建議 adOpenForwardOnly + adLockReadOnly 以節省記憶體。msado15.dll 為 32 位元,64 位元專案請改用 msado60.tlb 或安裝 64 位元 ACE Provider 並調整連接字串。Command 物件搭配 Parameters 集合防止 SQL Injection。BeginTrans/CommitTrans/RollbackTrans 確保資料一致性。