邦定数据: CADORecordBinding

邦定数据 

定义一个绑定类,将其成员变量绑定到一个指定的记录集,以方便于访问记录集的字段值。 

(1). 从CADORecordBinding派生出一个类: 

class CCustomRs : public CADORecordBinding 
BEGIN_ADO_BINDING(CCustomRs) 
ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_szau_fname, 
sizeof(m_szau_fname), lau_fnameStatus, false) 
ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szau_lname, 
sizeof(m_szau_lname), lau_lnameStatus, false) 
ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_szphone, 
sizeof(m_szphone), lphoneStatus, true) 
END_ADO_BINDING() 

public: 
CHAR m_szau_fname[22]; 
ULONG lau_fnameStatus; 
CHAR m_szau_lname[42]; 
ULONG lau_lnameStatus; 
CHAR m_szphone[14]; 
ULONG lphoneStatus; 
}; 

其中将要绑定的字段与变量名用BEGIN_ADO_BINDING宏关联起来。每个字段对应于两个变量,一个存放字段的值,另一个存放字段的状态。字段用从1开始的序号表示,如1,2,3等等。 

特别要注意的是:如果要绑定的字段是字符串类型,则对应的字符数组的元素个数一定要比字段长度大2(比如m_szau_fname[22],其绑定的字段au_fname的长度实际是20),不这样绑定就会失败。我分析多出的2可能是为了存放字符串结尾的空字符null和BSTR字符串开头的一个字(表示BSTR的长度)。这个问题对于初学者来说可能是一个意想不到的问题。 

CADORecordBinding类的定义在icrsint.h文件里,内容是: 

class CADORecordBinding 
public: 
STDMETHOD_(const ADO_BINDING_ENTRY*, GetADOBindingEntries) (VOID) PURE; 
}; 

BEGIN_ADO_BINDING宏的定义也在icrsint.h文件里,内容是: 
#define BEGIN_ADO_BINDING(cls) public: / 
typedef cls ADORowClass; / 
const ADO_BINDING_ENTRY* STDMETHODCALLTYPE GetADOBindingEntries() { / 
static const ADO_BINDING_ENTRY rgADOBindingEntries[] = { 

ADO_VARIABLE_LENGTH_ENTRY2宏的定义也在icrsint.h文件里: 
#define ADO_VARIABLE_LENGTH_ENTRY2(Ordinal, DataType, Buffer, Size, Status, Modify)/ 
{Ordinal, / 
DataType, / 
0, / 
0, / 
Size, / 
offsetof(ADORowClass, Buffer), / 
offsetof(ADORowClass, Status), / 
0, / 
classoffset(CADORecordBinding, ADORowClass), / 
Modify}, 

#define END_ADO_BINDING宏的定义也在icrsint.h文件里: 
#define END_ADO_BINDING() {0, adEmpty, 0, 0, 0, 0, 0, 0, 0, FALSE}};/ 
return rgADOBindingEntries;} 

(2). 绑定 

_RecordsetPtr Rs1; 
IADORecordBinding *picRs=NULL; 
CCustomRs rs; 
...... 
Rs1->QueryInterface(__uuidof(IADORecordBinding), 
(LPVOID*)&picRs)); 
picRs->BindToRecordset(&rs); 

派生出的类必须通过IADORecordBinding接口才能绑定,调用它的BindToRecordset方法就行了。 

(3). rs中的变量即是当前记录字段的值 

//Set sort and filter condition: 
// Step 4: Manipulate the data 
Rs1->Fields->GetItem("au_lname")->Properties->GetItem("Optimize")->Value = true; 
Rs1->Sort = "au_lname ASC"; 
Rs1->Filter = "phone LIKE '415 5*'"; 

Rs1->MoveFirst(); 
while (VARIANT_FALSE == Rs1->EndOfFile) 
printf("Name: %s/t %s/tPhone: %s/n", 
(rs.lau_fnameStatus == adFldOK ? rs.m_szau_fname : ""), 
(rs.lau_lnameStatus == adFldOK ? rs.m_szau_lname : ""), 
(rs.lphoneStatus == adFldOK ? rs.m_szphone : "")); 
if (rs.lphoneStatus == adFldOK) 
strcpy(rs.m_szphone, "777"); 
TESTHR(picRs->Update(&rs)); // Add change to the batch 
Rs1->MoveNext(); 
Rs1->Filter = (long) adFilterNone; 
...... 
if (picRs) picRs->Release(); 
Rs1->Close(); 
pConn->Close(); 

只要字段的状态是adFldOK,就可以访问。如果修改了字段,不要忘了先调用picRs的Update(注意不是Recordset的Update),然后才关闭,也不要忘了释放picRs(即picRs->Release();)。 

(4). 此时还可以用IADORecordBinding接口添加新纪录 

if(FAILED(picRs->AddNew(&rs))) 
......
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值