ADO入门(下)

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
 10、邦定数据

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

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

classCCustomRs:publicC ADORecordBinding
{
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:
CHARm_szau_fname[22];
ULONGlau_fnameStatus;
CHARm_szau_lname[42];
ULONGlau_lnameStatus;
CHARm_szphone[14];
ULONGlphoneStatus;
};
  其中将要绑定的字段与变量名用BEGIN_ ADO_BINDING宏关联起来。每个字段对应于两个变量,一个存放字段的值,另一个存放字段的状态。字段用从1开始的序号表示,如1,2,3等等。

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

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

classC ADORecordBinding
{
public:
STDMETHOD_(const ADO_BINDING_ENTRY*,Get ADOBindingEntries)(VOID)PURE;
};

BEGIN_ ADO_BINDING宏的定义也在icrsint.h文件里,内容是:
#defineBEGIN_ ADO_BINDING(cls)public:/
typedefcls ADORowClass;/
const ADO_BINDING_ENTRY*STDMETHODCALLTYPEGet ADOBindingEntries(){/
staticconst ADO_BINDING_ENTRYrg ADOBindingEntries[]={

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(C ADORecordBinding, ADORowClass),/
Modify},

#defineEND_ ADO_BINDING宏的定义也在icrsint.h文件里:
#defineEND_ ADO_BINDING(){0,adEmpty,0,0,0,0,0,0,0,FALSE}};/
returnrg ADOBindingEntries;}
   (2).绑定

_RecordsetPtrRs1;
I ADORecordBinding*picRs=NULL;
CCustomRsrs;
......
Rs1->QueryInterface(__uuidof(I ADORecordBinding),
(LPVOID*)&picRs));
picRs->BindToRecordset(&rs);
  派生出的类必须通过I ADORecordBinding接口才能绑定,调用它的BindToRecordset方法就行了。

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

//Setsortandfiltercondition:
//Step4:Manipulatethedata
Rs1->Fields->GetItem("au_lname")->Properties->GetItem("Optimize")->Value=true;
Rs1->Sort="au_lnameASC";
Rs1->Filter="phoneLIKE'4155*'";

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));//Addchangetothebatch
Rs1->MoveNext();
}
Rs1->Filter=(long)adFilterNone;
......
if(picRs)picRs->Release();
Rs1->Close(); 1

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值