// App::InitInstance
BOOL CMyApp::InitInstance() { AfxOleInit(); /* ... */ return TRUE; }
// App::ExitInstance
int CMyApp::ExitInstance() { ::CoUninitialize(); return CWinApp::ExitInstance(); }
// stdafx.h
#include
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF","adoEOF")
comdef.h 提供 _variant_t、_bstr_t 等智慧型別rename 避免 EOF 命名衝突class CMyDlg : public CDialog {
_ConnectionPtr m_conn; _RecordsetPtr m_rs; CListCtrl m_list;
// ...
void OnQuery() {
m_list.DeleteAllItems();
m_conn.CreateInstance(__uuidof(Connection));
m_rs.CreateInstance(__uuidof(Recordset));
try {
m_conn->Open("DSN=ADOTest", "", "", 0);
m_rs->Open("SELECT * FROM middle", _variant_t((IDispatch*)m_conn),
adOpenDynamic, adLockOptimistic, adCmdText);
while (!m_rs->adoEOF) {
_variant_t v = m_rs->GetCollect("BIG_NAME");
if (v.vt != VT_NULL) m_list.AddString((char*)_bstr_t(v));
m_rs->MoveNext();
}
} catch (_com_error e) { AfxMessageBox(e.ErrorMessage()); }
// 關閉順序嚴禁重複
if (m_rs) { m_rs->Close(); m_rs = NULL; }
if (m_conn){ m_conn->Close(); m_conn = NULL; }
}
};
(內容同 9267 文章,此處不重複)
void ExecuteSQL(_ConnectionPtr conn, _RecordsetPtr rs, CString sql) {
try {
rs->Open(sql.AllocSysString(), _variant_t((IDispatch*)conn),
adOpenDynamic, adLockOptimistic, adCmdText);
} catch (_com_error e) {
AfxMessageBox(e.Description());
if (e.WCode()==3127) AfxMessageBox("資料表不存在");
if (e.WCode()==3092) AfxMessageBox("資料表已存在");
}
}
// 遍歷、刪除首筆、新增三筆、修改第二筆年齡
m_rs->Open("SELECT * FROM users", ...);
while(!m_rs->adoEOF) { /* TRACE 輸出 */ m_rs->MoveNext(); }
m_rs->MoveFirst(); m_rs->Delete(adAffectCurrent);
for(int i=0;i<3;i++) { m_rs->AddNew(); m_rs->PutCollect("ID",i+10); /* ... */ }
m_rs->Move(1, _variant_t(adBookmarkFirst));
m_rs->PutCollect("age", 45L); m_rs->Update();
Close(),否則觸發存取違規_variant_t/_bstr_t 大幅簡化 COM 型別轉換e.WCode() 可針對性處理(如 3127/3092)