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

Visual C++ ADO 擴充套件:以 IADORecordBinding 實現高效資料綁定

     編輯:VC 教學

痛點:VARIANT 型別轉換的效能與複雜度

傳統 ADO 程式需手動將 _variant_t 轉換為 C++ 原生型別,再存入結構體,程式碼冗長且效能受損。Visual C++ Extensions for ADO (ADOExt) 提供 IADORecordBinding 介面與巨集,實現資料庫欄位到 C++ 變數的直接綁定與自動型別轉換。

核心架構

  • CADORecordBinding:巨集包裝類別,定義綁定項目。
  • IADORecordBinding:三個方法 —— BindToRecordset、AddNew、Update。
  • OLE DB 存取器:底層自動建立,管理緩衝區、狀態位、長度資訊。

實作流程四步驟

  1. 建立繼承 CADORecordBinding 的類別。
  2. 在 BEGIN_ADO_BINDING / END_ADO_BINDING 之間宣告綁定項目。
  3. 宣告對應的 C++ 成員變數(緩衝區、狀態、長度)。
  4. 執行期取得 IADORecordBinding 介面,呼叫 BindToRecordset。

綁定巨集分類與參數

巨集適用型別關鍵參數
ADO_FIXED_LENGTH_ENTRY定長(adDate, adBoolean 等)Ordinal, DataType, Buffer, Status, Modify
ADO_NUMERIC_ENTRY數值型(adInteger, adDouble 等)+ Precision, Scale
ADO_VARIABLE_LENGTH_ENTRY變長(adVarChar, adVarBinary 等)+ Size, Length

參數說明:Ordinal 欄位序號(1-based)、Status 狀態位(adFldOK/adFldNull)、Modify 是否允許更新。

完整範例:Employee 資料表綁定


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

_COM_SMARTPTR_TYPEDEF(IADORecordBinding, __uuidof(IADORecordBinding));

class CCustomRs : public CADORecordBinding {
    BEGIN_ADO_BINDING(CCustomRs)
        ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_ch_fname, sizeof(m_ch_fname), m_ul_fnameStatus, FALSE)
        ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_ch_lname, sizeof(m_ch_lname), m_ul_lnameStatus, FALSE)
    END_ADO_BINDING()
public:
    CHAR m_ch_fname[22], m_ch_lname[32];
    ULONG m_ul_fnameStatus, m_ul_lnameStatus;
};

void main() {
    ::CoInitialize(NULL);
    try {
        _RecordsetPtr pRs("ADODB.Recordset");
        CCustomRs rs;
        IADORecordBindingPtr picRs(pRs); // QueryInterface 取得綁定介面
        pRs->Open("SELECT * FROM Employee ORDER BY lname", "dsn=pubs;uid=sa;pwd=;", adOpenStatic, adLockOptimistic, adCmdText);
        TESTHR(picRs->BindToRecordset(&rs));
        while (!pRs->EndOfFile) {
            printf("Name = %s %s\n",
                rs.m_ul_fnameStatus == adFldOK ? rs.m_ch_fname : "",
                rs.m_ul_lnameStatus == adFldOK ? rs.m_ch_lname : "");
            pRs->MoveNext();
        }
    } catch (_com_error& e) { /* 錯誤處理 */ }
    ::CoUninitialize();
}

優勢總結

  • ✅ 零手動轉換:OLE DB 存取器自動處理型別轉換與資料搬移。
  • ✅ 型別安全:編譯期檢查 C++ 變數型別與巨集宣告一致性。
  • ✅ 效能最佳化:直接記憶體複製,避免 Variant 中介層開銷。
  • ✅ 程式碼簡潔:宣告式綁定,業務邏輯專注於 C++ 物件操作。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved