VC6.0 + Windows XP + Access 2000 (Jet 4.0),使用 `#import` 引入 ADO/ADOX 型別庫,透過智慧指標操作 COM 物件。
#import "C:\\Program Files\\Common Files\\System\\ado\\msado15.dll" no_namespace rename("EOF", "adoEOF")
BOOL CreateMdb(LPCTSTR path)
{
::CoInitialize(NULL);
HRESULT hr = S_OK;
try {
ADOX::_CatalogPtr cat; cat.CreateInstance(__uuidof(ADOX::Catalog));
CString conn; conn.Format(_T("Provider=Microsoft.JET.OLEDB.4.0;Data Source=%s;"), path);
cat->Create(_bstr_t(conn)); // 核心建庫語句
} catch (_com_error& e) {
AfxMessageBox(e.ErrorMessage()); ::CoUninitialize(); return FALSE;
}
::CoUninitialize(); return TRUE;
}
BOOL CreateTable(_ConnectionPtr& conn, LPCTSTR sql)
{
_variant_t ra;
try {
conn->Execute(_bstr_t(sql), &ra, adCmdText);
} catch (_com_error& e) {
AfxMessageBox(e.ErrorMessage()); return FALSE;
}
return TRUE;
}
// 呼叫範例
CString sql = _T("CREATE TABLE AxisSave (ID INTEGER, X_Axis REAL, Y_Axis REAL, TestResult INTEGER)");
CreateTable(conn, sql);
BOOL CMyDlg::CreateDatabase()
{
CString mdbPath = _T("C:\\Data\\Test.mdb");
if (PathFileExists(mdbPath)) return TRUE; // 已存在
CoInitialize(NULL);
ADOX::_CatalogPtr cat; cat.CreateInstance(__uuidof(ADOX::Catalog));
CString connStr; connStr.Format(_T("Provider=Microsoft.JET.OLEDB.4.0;Data Source=%s;"), mdbPath);
cat->Create(_bstr_t(connStr));
_ConnectionPtr conn; conn.CreateInstance(__uuidof(Connection));
conn->Open(_bstr_t(connStr), "", "", adConnectUnspecified);
CString sql = _T("CREATE TABLE Log (ID COUNTER PRIMARY KEY, Msg MEMO, LogTime DATETIME DEFAULT NOW())");
conn->Execute(_bstr_t(sql), NULL, adExecuteNoRecords);
conn->Close(); CoUninitialize();
return TRUE;
}
Index、Order),否則 SQL 執行失敗。