god 发表于 2005-3-30 22:53

[转帖]在Visual C++中用ADO进行数据库编程(下)

<TABLE cellPadding=0 cellSpacing=0 height=325 style="TABLE-LAYOUT: fixed" width="100%">

<TR>
<TD vAlign=top width=32></TD>
<TD  vAlign=top>5. 记录集的遍历、更新

     根据我们刚才通过执行SQL命令建立好的users表,它包含四个字段:ID,username,old,birthday
以下的代码实现:打开记录集,遍历所有记录,删除第一条记录,添加三条记录,移动光标到第二条记录,
更改其年龄,保存到数据库。
_variant_t vUsername,vBirthday,vID,vOld;
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset-&gt;Open("SELECT * FROM users",
_variant_t((IDispatch*)m_pConnection,true),
adOpenStatic,
adLockOptimistic,
adCmdText);
while(!m_pRecordset-&gt;adoEOF)
{
   vID = m_pRecordset-&gt;GetCollect(_variant_t((long)0));///取得第1列的值,从0开始计数,
   ///你也可以直接给出列的名称,如下一行
   vUsername = m_pRecordset-&gt;GetCollect("username");///取得username字段的值
   vOld = m_pRecordset-&gt;GetCollect("old");
   vBirthday = m_pRecordset-&gt;GetCollect("birthday");
   ///在DEBUG方式下的OUTPUT窗口输出记录集中的记录
   if(vID.vt != VT_NULL &amp;&amp; vUsername.vt != VT_NULL &amp;&amp; vOld.vt != VT_NULL &amp;&amp; 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-&gt;MoveNext();///移到下一条记录
}
m_pRecordset-&gt;MoveFirst();///移到首条记录
m_pRecordset-&gt;Delete(adAffectCurrent);///删除当前记录
///添加三条新记录并赋值
for(int i=0;i&lt;3;i++)
{
   m_pRecordset-&gt;AddNew();///添加新记录
   m_pRecordset-&gt;PutCollect("ID",_variant_t((long)(i+10)));
   m_pRecordset-&gt;PutCollect("username",_variant_t("叶利钦"));
   m_pRecordset-&gt;PutCollect("old",_variant_t((long)71));
   m_pRecordset-&gt;PutCollect("birthday",_variant_t("1930-3-15"));
}
m_pRecordset-&gt;Move(1,_variant_t((long)adBookmarkFirst));///从第一条记录往下移动一条记录,即移动到第二条记录处
m_pRecordset-&gt;PutCollect(_variant_t("old"),_variant_t((long)45));///修改其年龄
m_pRecordset-&gt;Update();///保存到库中   
备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果
void ExecuteSQL(_ConnectionPtr  m_pConnection, _RecordsetPtr  m_pRecordset,CString strSql)
{
   //执行Select 语句
   BSTR bstrSQL = strSql.AllocSysString();           
    try
    {
       m_pRecordset-&gt;Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
           //adOpenDynamic:动态  adLockOptimistic乐观封锁法  adCmdText:文本查询语句
    }
    catch(_com_error error)
    {
       CString errorMessage;
       errorMessage.format("%s",(LPTSTR)error.Description());
       AfxMessageBox(errorMessage);
    }
}        
//出错处理:
3127——没有找到目标表
3092——目标表已经存在
例如:
catch(const _com_error e)
{
    AfxMessageBox(e.Description());
    long errorCode=e.WCode();
    if(3127==errorCode) AfxMessageBox("表不存在");
    if(3092==errorCode) AfxMessageBox("表已经存在");
    return FALSE;
}

</TD></TR></TABLE>

wangyu249 发表于 2006-11-21 15:14

<p>不错</p>
页: [1]
查看完整版本: [转帖]在Visual C++中用ADO进行数据库编程(下)