比 ODBC 版 Excel 更簡單,可混用 SQL 與 DAO 類別函式,彈性更高。

#include
CDaoDatabase db;
CDaoRecordset rs(&db);
void OnWrite() {
CString path = GetAppPath() + "\\Demo.mdb";
if (!FileExists(path)) {
db.Create(path); // 建立 .mdb
db.Execute("CREATE TABLE DemoTable(Name VARCHAR(20), Age VARCHAR(3))");
rs.Open(AFX_DAO_USE_DEFAULT_TYPE, "SELECT * FROM DemoTable");
// SQL 寫入
db.Execute("INSERT INTO DemoTable (Name,Age) VALUES ('徐景周',26)");
// DAO 寫入
rs.AddNew(); rs.SetFieldValue("Name","徐志慧"); rs.SetFieldValue("Age","21"); rs.Update();
rs.AddNew(); rs.SetFieldValue("Name","郭徽"); rs.SetFieldValue("Age","27"); rs.Update();
rs.Close(); db.Close(); AfxMessageBox("寫入成功");
} else AfxMessageBox("檔案已存在");
}
void OnRead() {
COleVariant var; var.ChangeType(VT_BSTR);
CString path = GetAppPath() + "\\Demo.mdb";
db.Open(path);
rs.Open(AFX_DAO_USE_DEFAULT_TYPE, "SELECT * FROM DemoTable");
m_List.ResetContent();
while (!rs.IsEOF()) {
rs.GetFieldValue("Name", var); CString name = (LPCSTR)var.pbstrVal;
rs.GetFieldValue("Age", var); CString age = (LPCSTR)var.pbstrVal;
m_List.AddString(name + " --> " + age);
rs.MoveNext();
}
rs.Close(); db.Close();
}
AFX_DAO_USE_DEFAULT_TYPE 讓 MFC 自動選擇資料表/動態集/快照型記錄集COleVariant 需先 ChangeType(VT_BSTR) 才能安全取 pbstrVal