傳統 ADO 程式需手動將 _variant_t 轉換為 C++ 原生型別,再存入結構體,程式碼冗長且效能受損。Visual C++ Extensions for ADO (ADOExt) 提供 IADORecordBinding 介面與巨集,實現資料庫欄位到 C++ 變數的直接綁定與自動型別轉換。
BindToRecordset、AddNew、Update。CADORecordBinding 的類別。BEGIN_ADO_BINDING / END_ADO_BINDING 之間宣告綁定項目。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 是否允許更新。
#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();
}