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

ADO 取得 Access 資料表欄位名稱:Fields 集合遍歷完整範例

     編輯:關於VC++

需求場景

動態建構查詢、匯出工具或通用編輯器時,需在執行期取得資料表所有欄位名稱。本文示範 ADO Fields 集合遍歷取得欄位名稱並填入 CListBox。

專案建立步驟

  1. MFC AppWizard (exe) → Dialog based
  2. 對話框放入 Button (IDC_SHOWFIELDS, "顯示欄位") 與 ListBox (IDC_LIST_FIELDS)
  3. 建立 Access FTI.mdb,含資料表 Images

核心程式碼

1. 引入 ADO 型別庫


// stdafx.h
#import "c:\program files\common files\system\ado\msado15.dll" \
    no_namespace rename("EOF", "adoEOF")

2. 初始化 COM 與連線


// App::InitInstance
AfxOleInit();

// Dialog 建構函數
m_pConnection.CreateInstance(__uuidof(Connection));
try {
    m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\FTI.mdb", "", "", adModeUnknown);
}
catch (_com_error& e) { AfxMessageBox(_T("資料庫連接失敗!")); }

m_pRecordset.CreateInstance(__uuidof(Recordset));

3. 列舉欄位名稱


void CGetFieldNameDlg::OnButtonShowFields()
{
    m_FieldsList.ResetContent();

    _bstr_t sql = "SELECT * FROM Images";
    m_pRecordset->Open(sql,
        m_pConnection.GetInterfacePtr(),
        adOpenDynamic, adLockOptimistic, adCmdText);

    Fields* pFields = NULL;
    HRESULT hr = m_pRecordset->get_Fields(&pFields);
    if (FAILED(hr)) return;

    long nCount = 0;
    pFields->get_Count(&nCount);

    for (long i = 0; i < nCount; ++i) {
        Field* pField = NULL;
        pFields->get_Item(_variant_t(i), &pField);
        if (pField) {
            BSTR bstrName = NULL;
            pField->get_Name(&bstrName);
            if (bstrName) {
                m_FieldsList.AddString(CString(bstrName));
                SysFreeString(bstrName);
            }
            pField->Release();
        }
    }
    pFields->Release();
}

執行結果

欄位列表

重點提示

  • get_Fields 取得集合指標,記得 Release
  • 欄位索引為 0-based,使用 _variant_t(i) 傳遞
  • get_Name 回傳 BSTR,使用完須 SysFreeString
  • 適用於任何 ADO 支援的資料來源 (SQL Server, Oracle, Excel 等)

原始碼下載

完整 Dialog 專案原始碼,含錯誤處理與資源清理。

本文配套源碼

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