BOOL CADOTestApp::InitInstance()
{
AfxOleInit(); // 初始化 OLE/COM 程式庫
// ...
}
stdafx.h:
#include
#import "C:\Program Files\Common Files\System\ado\msado15.dll" \
no_namespace \
rename("EOF", "adoEOF")
| 智慧指標 | 用途 |
|---|---|
_ConnectionPtr | 建立連線、執行無傳回結果的 SQL (DDL、Stored Procedure) |
_CommandPtr | 參數化命令、預存程序、傳回 Recordset |
_RecordsetPtr | 資料列集合操作:游標、鎖定、篩選、排序、逐筆存取 |
class CAboutDlg : public CDialog
{
_ConnectionPtr m_pConn;
_RecordsetPtr m_pRs;
CListBox m_lst;
// ...
};
BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
_variant_t val;
m_lst.ResetContent();
try
{
m_pConn.CreateInstance(__uuidof(Connection));
m_pRs.CreateInstance(__uuidof(Recordset));
// 開啟 ODBC 系統 DSN
m_pConn->Open(_T("DSN=ADOTest"), _T(""), _T(""), 0);
// 執行查詢
m_pRs->Open(_T("SELECT * FROM BlockDefine"),
_variant_t((IDispatch*)m_pConn),
adOpenDynamic, adLockOptimistic, adCmdText);
// 遍歷記錄
while (!m_pRs->adoEOF)
{
val = m_pRs->GetCollect(_T("BlockIndex"));
if (val.vt != VT_NULL)
m_lst.AddString((char*)_bstr_t(val));
m_pRs->MoveNext();
}
m_pRs->Close();
m_pConn->Close();
}
catch (_com_error& e)
{
AfxMessageBox(e.ErrorMessage());
}
m_pRs = NULL;
m_pConn = NULL;
return TRUE;
}
_variant_t 封裝 VARIANT,支援隱含轉換至 int, double, CString 等。_bstr_t 封裝 BSTR,提供 char* 轉換運算子,方便 MFC 字串函數使用。VT_NULL 檢查資料庫 NULL 值,避免轉換例外。
catch (_com_error& e)
{
CString msg;
msg.Format(_T("ADO 錯誤 (0x%08X): %s"), e.Error(), e.ErrorMessage());
AfxMessageBox(msg);
// 可記錄至日誌檔
}
m_pConn->State == adStateClosed 時重新 Open。m_pConn->BeginTrans(), CommitTrans(), RollbackTrans()。_CommandPtr + CreateParameter 防止 SQL Injection。