• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: 小 中 大 | 推荐给好友 上一篇 | 下一篇

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

发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 13次 | 进入软件测试论坛讨论

领测软件测试网

5. 记录集的遍历、更新

   根据我们刚才通过执行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)
{
  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();///保存到库中  
备注:多次查询可把查询过程做成一个函数ExecuteSQL让m_pRecordset获得连接指针m_pConnection查询结果
void ExecuteSQL(_ConnectionPtr m_pConnection, _RecordsetPtr m_pRecordset,CString strSql)
{
  //执行Select 语句
  BSTR bstrSQL = strSql.AllocSysString();     
   try
   {
    m_pRecordset->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;
}

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:[email protected] 电话:010-51297073

软件测试 | 领测国际 | ISTQB | ISTQB官网 | TMMi | TMMi认证 | 国际软件测试工程师认证 | 领测软件测试网