首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 使用 ADO 動態建立 Access 資料庫與資料表

     編輯:VC 教學

前言

ADO (ActiveX Data Objects) 是 Windows 平台上存取關聯式資料庫的主流 COM 元件介面。本文示範在 VC++ 6.0 中透過 #import 導入 ADO/ADOX 型別庫,利用 ADOX::Catalog 動態建立 .mdb 檔案與資料表結構。

環境準備

  1. 引入型別庫:在 stdafx.h 中加入:
    #pragma warning(disable: 4146)
    #import "C:\\Program Files\\Common Files\\System\\ado\\msadox.dll" no_namespace
    #import "C:\\Program Files\\Common Files\\System\\ado\\msado15.dll" no_namespace rename("EOF", "EndOfFile")
    #pragma warning(default: 4146)
    路徑請依實際安裝位置調整;rename 避免 EOF 與標準庫衝突。
  2. 初始化 COM:在 InitInstance 或執行緒進入點呼叫 CoInitialize(NULL);結束時呼叫 CoUninitialize()。

建立資料庫檔案

HRESULT hr = S_OK;
CString strConn = _T("Provider=Microsoft.JET.OLEDB.4.0;Data Source=D:\\Test.mdb;");

try {
    ADOX::_CatalogPtr pCatalog = NULL;
    hr = pCatalog.CreateInstance(__uuidof(ADOX::Catalog));
    if (FAILED(hr)) throw _com_error(hr);

    // Create 檔案:傳入連接字串,ADOX 會自動建立空 .mdb
    pCatalog->Create(_bstr_t(strConn));
    // 此時檔案已存在,可進一步建立資料表
}
catch (_com_error &e) {
    // 錯誤處理
    CString msg; msg.Format(_T("ADO 錯誤: %s"), e.ErrorMessage());
    AfxMessageBox(msg);
}

執行 DDL 建立資料表

取得有效 _ConnectionPtr 後,直接執行 SQL DDL:

_ConnectionPtr pConn = pCatalog->GetActiveConnection(); // 取得內建連線
// 或自行 pConn.CreateInstance(__uuidof(Connection)); pConn->Open(strConn, "", "", adConnectUnspecified);

CString sql = _T("CREATE TABLE Test ( \
    Name TEXT(20) WITH COMPRESSION NOT NULL, \
    Score DECIMAL(12,4) NOT NULL DEFAULT 0, \
    ID SMALLINT NOT NULL DEFAULT 0, \
    Birthday DATE, \
    Sex CHAR(1), \
    CONSTRAINT CK_Sex CHECK (Sex IN ('M','F')), \
    CONSTRAINT PK_ID PRIMARY KEY (ID) \
);");

pConn->Execute(_bstr_t(sql), NULL, adExecuteNoRecords);

完整錯誤處理範本

_bstr_t bstrConn(strConn);
try {
    ADOX::_CatalogPtr cat; cat.CreateInstance(__uuidof(ADOX::Catalog));
    cat->Create(bstrConn); // 建檔

    _ConnectionPtr conn = cat->GetActiveConnection();
    conn->Execute(_bstr_t(sql), NULL, adExecuteNoRecords); // 建表

    AfxMessageBox(_T("資料庫與資料表建立成功!"));
}
catch (_com_error &e) {
    CString err; err.Format(_T("HRESULT: 0x%08X\n%s"), e.Error(), e.ErrorMessage());
    AfxMessageBox(err);
}

常見陷阱與提示

  • Provider 版本:JET 4.0 支援 Access 2000~2003 格式;若需 .accdb 請改用 Microsoft.ACE.OLEDB.12.0 並安裝 Access Database Engine。
  • 路徑權限:確保執行身分對目標資料夾有寫入權限。
  • 智慧指標:_CatalogPtr、_ConnectionPtr 等皆為 _com_ptr_t 封裝,離開作用域自動 Release,無需手動管理。
  • Unicode:專案設定為 Unicode 時,連接字串與 SQL 均建議使用 _bstr_t 或 _variant_t 封裝 CString。

結語

ADO/ADOX 提供了極簡潔的程式化資料庫建構能力,適合安裝程式自動建立本地資料庫、單元測試環境初始化、離線資料快取等場景。掌握 #import + 智慧指標 + COM 錯誤處理的標準範式,能顯著提升 VC++ 資料庫開發效率。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved