记录集的遍历、更新
根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday
以下的代码实现:
打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,更改其年龄,保存到数据库。
_variant_t vUsername,vBirthday,vID,vOld;
_RecordsetPtr
m_pRecordset;
m_pRecordset.CreateInstance( "ADODB.Recordset
");
m_pRecordset->
Open( "SELECT * FROM users
",_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
while(!m_pRecordset-> adoEOF)
///这里为什么是adoEOF而不是EOF呢?还记得rename( "EOF ", "adoEOF ")这一句吗?
{
vID = m_pRecordset-> GetCollect(_variant_t((long)0)
);///取得第1列的值,从0开始计数,你也可以直接给出列的名称,如下一行
vUsername =
m_pRecordset-> GetCollect( "username ");
///取得username字段的值
vOld = m_pRecordset-> GetCollect( "old ");
vBirthday = m_pRecordset-> GetCollect( "birthday ");
///在DEBUG方式下的OUTPUT窗口输出记录集中的记录
if(vID.vt != VT_NULL
&& vUsername.vt != VT_NULL && vOld.vt !=
VT_NULL && vBirthday.vt != VT_NULL)
TRACE(
"id:%d,姓名:%s,年龄:%d,生日:%s\r\n
",vID.lVal,(LPCTSTR)(_bstr_t)vUsername,vOld.lVal,(LPCTSTR)(_bstr_t)vBirthday)
;
m_pRecordset-> MoveNext();
///移到下一条记录 }
m_pRecordset-> MoveFirst();
///移到首条记录 m_pRecordset->
Delete(adAffectCurrent);
///删除当前记录 ///添加三条新记录并赋值
for(int i=0;i <3;i++)
{
m_pRecordset->
AddNew();///添加新记录
m_pRecordset-> PutCollect( "ID
",_variant_t((long)(i+10)));
m_pRecordset-> PutCollect(
"username ",_variant_t( "叶利钦 "));
m_pRecordset-> PutCollect(
"old ",_variant_t((long)71));
m_pRecordset-> PutCollect(
"birthday ",_variant_t( "1930-3-15 "));
}
m_pRecordset-> Move(1,_variant_t((long)adBookmarkFirst));
///从第一条记录往下移动一条记录,即移动到第二条记录处
m_pRecordset->
PutCollect(_variant_t( "old "),_variant_t((long)45));
///修改其年龄
m_pRecordset-> Update();
///保存到库中