ADO (ActiveX Data Objects) 建立於 OLE DB 之上,比 ODBC/DAO/RDO 更簡單易用且不失彈性。
AfxOleInit() 初始化 COM#import "msado15.dll" no_namespace rename("EOF","adoEOF") 引入型別庫_ConnectionPtr 建立連線_RecordsetPtr / _CommandPtr 執行 SQL、處理結果Close()、Release()// Access 2000
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\test.mdb"
// Access 97
"Provider=Microsoft.Jet.OLEDB.3.51;Data Source=C:\\test.mdb"
// SQL Server (無 DSN)
"Driver={SQL Server};Server=127.0.0.1;Database=db;UID=sa;PWD=123"
// DSN
"DSN=myDSN;UID=sa;PWD=;"
Open(connStr, user, pwd, opt):opt 可指定 adModeReadWrite、adAsyncConnect 等Execute(sql, &recordsAffected, adCmdText):執行不回傳記錄集的 SQLConnectionTimeout、State 屬性BeginTrans/CommitTrans/RollbackTrans 交易控制// 1. Connection.Execute 回傳
_variant_t ra; m_rs = m_conn->Execute("SELECT * FROM t", &ra, adCmdText);
// 2. Command 物件
_CommandPtr cmd; cmd.CreateInstance("ADODB.Command");
cmd->ActiveConnection = m_conn; cmd->CommandText = "SELECT * FROM t";
m_rs = cmd->Execute(&vNull, &vNull, adCmdText);
// 3. Recordset.Open 直接查詢(最靈活)
m_rs->Open("SELECT * FROM t",
_variant_t((IDispatch*)m_conn, TRUE),
adOpenStatic, adLockOptimistic, adCmdText);
| 游標 | 值 | 特性 |
|---|---|---|
| adOpenForwardOnly | 0 | 唯向前、效能最好、無書籤/RecordCount |
| adOpenKeyset | 1 | 可見他人更新、不可見新增刪除 |
| adOpenDynamic | 2 | 完全動態、支援所有移動 |
| adOpenStatic | 3 | 靜態複本、適合報表 |
| 鎖定 | 值 | 特性 |
|---|---|---|
| adLockReadOnly | 1 | 唯讀 |
| adLockPessimistic | 2 | 編輯即鎖定 |
| adLockOptimistic | 3 | Update 時才鎖定 |
| adLockBatchOptimistic | 4 | 批次更新 |
while (!m_rs->adoEOF) { // 注意:rename("EOF","adoEOF")
_variant_t v = m_rs->GetCollect("fieldName");
// 或 m_rs->Fields->GetItem("fieldName")->Value
m_rs->MoveNext();
}
m_rs->MoveFirst();
m_rs->Delete(adAffectCurrent); // 刪除
m_rs->AddNew(); m_rs->PutCollect("f", val); m_rs->Update(); // 新增
m_rs->Move(1, _variant_t(adBookmarkFirst)); // 移至第二筆
m_rs->PutCollect("f", newVal); m_rs->Update(); // 修改
catch (_com_error e) {
AfxMessageBox(e.ErrorMessage());
// e.WCode() 可取得 HRESULT,如 3127=找不到表、3092=表已存在
}
Recordset 進階屬性/方法、參數化命令/預存程序、交易處理、BLOB 圖片存取、DataGrid 繫結。