<script type="text/javascript">
</script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
定义一个绑定类,将其成员变量绑定到一个指定的记录集,以方便于访问记录集的字段值。
(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>
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>