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

VC++ 智慧指標操作 ADO 存取資料庫:#import 指令與 _ConnectionPtr 實作

     編輯:VC 教學

環境建置

1. 初始化 COM


BOOL CADOTestApp::InitInstance()
{
    AfxOleInit(); // 初始化 OLE/COM 程式庫
    // ...
}

2. 引入 ADO 型別庫

stdafx.h:


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

智慧指標類別

智慧指標用途
_ConnectionPtr建立連線、執行無傳回結果的 SQL (DDL、Stored Procedure)
_CommandPtr參數化命令、預存程序、傳回 Recordset
_RecordsetPtr資料列集合操作:游標、鎖定、篩選、排序、逐筆存取

完整範例:ODBC DSN 查詢並顯示於 ListBox

1. 成員宣告


class CAboutDlg : public CDialog
{
    _ConnectionPtr m_pConn;
    _RecordsetPtr  m_pRs;
    CListBox       m_lst;
    // ...
};

2. OnInitDialog 實作


BOOL CAboutDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    _variant_t val;
    m_lst.ResetContent();

    try
    {
        m_pConn.CreateInstance(__uuidof(Connection));
        m_pRs.CreateInstance(__uuidof(Recordset));

        // 開啟 ODBC 系統 DSN
        m_pConn->Open(_T("DSN=ADOTest"), _T(""), _T(""), 0);

        // 執行查詢
        m_pRs->Open(_T("SELECT * FROM BlockDefine"),
            _variant_t((IDispatch*)m_pConn),
            adOpenDynamic, adLockOptimistic, adCmdText);

        // 遍歷記錄
        while (!m_pRs->adoEOF)
        {
            val = m_pRs->GetCollect(_T("BlockIndex"));
            if (val.vt != VT_NULL)
                m_lst.AddString((char*)_bstr_t(val));
            m_pRs->MoveNext();
        }

        m_pRs->Close();
        m_pConn->Close();
    }
    catch (_com_error& e)
    {
        AfxMessageBox(e.ErrorMessage());
    }

    m_pRs = NULL;
    m_pConn = NULL;
    return TRUE;
}

關鍵型別轉換

  • _variant_t 封裝 VARIANT,支援隱含轉換至 int, double, CString 等。
  • _bstr_t 封裝 BSTR,提供 char* 轉換運算子,方便 MFC 字串函數使用。
  • VT_NULL 檢查資料庫 NULL 值,避免轉換例外。

錯誤處理最佳實務


catch (_com_error& e)
{
    CString msg;
    msg.Format(_T("ADO 錯誤 (0x%08X): %s"), e.Error(), e.ErrorMessage());
    AfxMessageBox(msg);
    // 可記錄至日誌檔
}

進階主題

  • 斷線重連:偵測 m_pConn->State == adStateClosed 時重新 Open。
  • 交易控制:m_pConn->BeginTrans(), CommitTrans(), RollbackTrans()。
  • 參數化查詢:使用 _CommandPtr + CreateParameter 防止 SQL Injection。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved