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

VC 下 ADO 編程入門 (2-4):對話框應用完整實戰 - 連接 SQL Server 顯示資料至列表控制項

     編輯:VC 教學

專案目標

建立基於對話框的 MFC 應用 `zjy`,點擊按鈕連接本機 SQL Server (Northwind 資料庫),將 `Customers` 資料表內容顯示於報表模式的 `CListCtrl` 中。

環境準備

  • VC6 + SQL Server (本機 127.0.0.1,sa 空密碼)
  • 專案類型:MFC AppWizard (exe) → Dialog based
  • 對話框資源:加入一個 Button (IDC_BTN_QUERY) 與 List Control (IDC_LIST_DATA),屬性設為 **Report** 模式
  • ClassWizard 為 List Control 添加控制項變數 `m_list` (CListCtrl)

核心代碼實現

1. StdAfx.h 引入 ADO 類型庫

#import "C:\Program Files\Common Files\System\ado\msado15.dll" \
    no_namespace rename("EOF", "adoEOF")

2. zjy.cpp 自動初始化/釋放 COM 庫 (RAII 模式)

struct InitOle {
    InitOle()  { ::CoInitialize(NULL); }
    ~InitOle() { ::CoUninitialize(); }
} _init_InitOle_;

3. zjyDlg.h 宣告成員變數

class CZjyDlg : public CDialog {
    // ...
protected:
    bool m_IsConnectionOpen = false;
    _ConnectionPtr m_pConnection;
    _RecordsetPtr m_pRecordset;
    // ...
};

4. zjyDlg.cpp OnInitDialog 初始化連接與查詢

BOOL CZjyDlg::OnInitDialog() {
    CDialog::OnInitDialog();
    // ... 系統選單/圖示初始化 ...

    // List Control 報表模式初始化 (插入欄位)
    m_list.InsertColumn(0, _T("CustomerID"), LVCFMT_LEFT, 100);
    m_list.InsertColumn(1, _T("CompanyName"), LVCFMT_LEFT, 200);
    m_list.InsertColumn(2, _T("ContactName"), LVCFMT_LEFT, 150);
    m_list.InsertColumn(3, _T("Phone"), LVCFMT_LEFT, 100);
    m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

    // ADO 連接與查詢
    HRESULT hr;
    _bstr_t bstrQuery("SELECT CustomerID, CompanyName, ContactName, Phone FROM Customers");
    _bstr_t strConnect = "Provider=SQLOLEDB; Data Source=127.0.0.1; Initial Catalog=Northwind; User ID=sa; Password=;";
    _variant_t vNull; vNull.vt = VT_ERROR; vNull.scode = DISP_E_PARAMNOTFOUND;

    try {
        hr = m_pConnection.CreateInstance(__uuidof(Connection));
        if (SUCCEEDED(hr)) {
            hr = m_pConnection->Open(strConnect, _bstr_t(L""), _bstr_t(L""), adConnectUnspecified);
            if (SUCCEEDED(hr)) {
                m_IsConnectionOpen = true;
                m_pRecordset = m_pConnection->Execute(bstrQuery, &vNull, adCmdText);
                PopulateListCtrl();  // 填充資料
            }
        }
    }
    catch (_com_error& e) {
        AfxMessageBox(e.ErrorMessage());
    }

    return TRUE;
}

5. 填充 List Control 協助函數

void CZjyDlg::PopulateListCtrl() {
    m_list.DeleteAllItems();
    if (!m_pRecordset) return;

    int nRow = 0;
    while (!m_pRecordset->adoEOF) {
        CString strID = (LPCTSTR)_bstr_t(m_pRecordset->Fields->GetItem("CustomerID")->Value);
        CString strCompany = (LPCTSTR)_bstr_t(m_pRecordset->Fields->GetItem("CompanyName")->Value);
        CString strContact = (LPCTSTR)_bstr_t(m_pRecordset->Fields->GetItem("ContactName")->Value);
        CString strPhone = (LPCTSTR)_bstr_t(m_pRecordset->Fields->GetItem("Phone")->Value);

        m_list.InsertItem(nRow, strID);
        m_list.SetItemText(nRow, 1, strCompany);
        m_list.SetItemText(nRow, 2, strContact);
        m_list.SetItemText(nRow, 3, strPhone);
        nRow++;

        m_pRecordset->MoveNext();
    }
}

6. 清理資源 (OnCancel/OnOK/析構)

void CZjyDlg::OnCancel() {
    if (m_pRecordset) { m_pRecordset->Close(); m_pRecordset = NULL; }
    if (m_pConnection && m_IsConnectionOpen) { m_pConnection->Close(); m_IsConnectionOpen = false; }
    CDialog::OnCancel();
}

關鍵技術點總結

環節關鍵代碼/設定
ADO 導入`#import msado15.dll rename("EOF","adoEOF")`
COM 初始化RAII 結構體 `InitOle` 全域實例
連接字串`SQLOLEDB` Provider,指定 Data Source/Initial Catalog/User/Password
執行查詢`Connection::Execute` 返回 `_RecordsetPtr`
欄位取值`Fields->GetItem("ColumnName")->Value` 轉 `_bstr_t` 再轉 `CString`
ListCtrl 報表模式`InsertColumn` + `LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES`
資源釋放關閉 Recordset/Connection,智能指標賦 NULL

常見錯誤排查

  • 連接失敗:檢查 SQL Server 服務、TCP/IP 協定啟用、防火牆 1433 埠、sa 登入權限
  • 編譯錯誤 `EOF` 重定義:確認 `rename("EOF","adoEOF")` 生效,或在代碼中用 `adoEOF`
  • 中文亂碼:資料庫欄位排序規則、連接字串加 `;Code Page=936`、專案設為 Unicode
  • 記憶體洩漏:所有 `_com_error` catch 區塊必須關閉連接並賦 NULL

結語

本例展示了 VC+ADO 連接 SQL Server 的最小完整閉環:COM 初始化 → 連接 → 執行查詢 → 綁定 UI → 資源清理。掌握此流程,即可快速構建資料庫前端應用。後續將介紹參數化命令、預存程序調用、事務處理、斷點續傳等進階主題。

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