VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 318|回复: 0

VC++高级班之数据库篇-[10]记录集对象的讲解与使用

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-6-12 00:51:34 | 显示全部楼层 |阅读模式
在 ADO 程序开发中,记录集对象 Recordset 对象代表一个表的记录集合或者是一个SQL命令或是存储过程的执行结果。
简单的说,记录集实际上缓存了从数据库获得的记录,应用程序可以从记录集中获得每条记录的字段。

①、记录集对象 Recordset 的属性:
⑴ RecordCount 属性:返回记录集中记录的个数;
⑵ BOF、EOF 属性:
BOF 指示当前记录位置位于记录集对象的第一个记录之前;
EOF 指示当前记录位置位于记录集对象的最后一个记录之后。
他们都是布尔值,即:只能为 True 或者 False。
他们被用于判断记录指针是否越界,这非常有用,如果越界操作,程序运行会产生错误。

如果没有打开记录集对象,BOF 和 EOF 都被设置为 True,RecordCount 属性值为 0;
如果打开的记录集对象中至少包含一条记录,则第一条记录为当前记录,BOF 和 EOF 属性都为 False。
⑶ AbsolutePosition 属性:指定记录集对象当前记录序号的位置;
⑷ ActiveConnection 属性:该属性指定记录集对象当前所属的 Connection 对象;
===================================================
②、记录集对象 Recordset 的方法:
⑴ Open 方法:
  1. HRESULT Open(
  2. const _variant_t & Source,
  3. const _variant_t & ActiveConnection,
  4. enum CursorTypeEnum CursorType,
  5. enum LockTypeEnum LockType,
  6. long Options
  7. )
复制代码

★ 参数 Source 是记录源,它可以是下列内容之一:Command 对象变量、SQL 语句、存储过程、表名或完整的路径名;
★ 参数 ActiveConnection 对应于记录集对象的 ActiveConnection 属性,指定在哪个连接中打开该记录集;
★ 参数 CursorType 指定打开记录集对象时使用的游标,他的取值可以是:
adOpenStatic:静态游标:提供对记录集的一个副本,允许各种移动操作,包括前移、后移等等,但其他用户所做的操作,例如:添加、修改、删除 等将不可见;
adOpenDynamic:动态游标:允许各种移动操作,包括前移、后移等等,并且其他用户所做的操作也可以直接显示出来;
adOpenForwardOnly:前向游标(默认):除仅允许在记录集中向前滚动之外,其行为类似静态游标。这样,当需要在记录集中单程移动时就可以提高性能;
adOpenKeyset:键集游标:类似于动态游标,也能看到其他用户所做的数据修改,但不能看到其他用户新添加的记录,也不能访问其他用户删除的记录;
★ 参数 LockType 指定打开记录集时应该使用的锁定类型,他的取值可以是:
adLockReadOnly:默认值,只读,不能改变数据;
adLockPessimistic:保守式锁定(逐个),数据提供者完成确保成功编辑记录所需的工作,通常通过在编辑时立即锁定数据源的记录;
adLockOptimistic:开放式锁定(逐个),数据提供者使用开放式锁定,只在调用Update方法时才锁定记录;
adLockBatchOptimistic:开放式批更新,用于批更新模式;
★ 参数 Options 是长整形数,它指定参数 Source 的种类,在调用 Open 方法时,Source 参数应该与 Options 参数相符,否则会出现错误。
建议直接指定该参数,如果指定 adCmdUnknow 可能会降低效率。其取值如下:
adCmdText:指示提供者应该将 Source 作为命令的文本定义来计算;
adCmdTable:指定 ADO 生成 SQL 查询以便从在 Source 中命名的表中返回所有行;
adCmdTableDirect:指示提供者更改从在 Source 中命名的表中返回所有行;
adCmdStoredProc:指示提供者应该将 Source 视为存储过程;
adCmdUnknown:指示Source参数中的命令参数为未知;

⑵ MoveFirst、MoveLast、MoveNext、MovePrevious 方法:这些方法可以对记录集的游标进行移动操作。
如果 OLE DB 提供者支持相关的功能,可以使用 AbsolutePosition、AbsolutePage 和 Filter 属性对当前记录重新定位。

⑶ GetCollect 方法用于取得字段的值,PutCollect 方法用于向记录字段中写入值。其语法如下:
_variant_t GetCollect( const _variant_t & Index )
void PutCollect( const _variant_t & Index, const _variant_t & pvar)
其中 Index 参数可以是字段名的字符串,也可以是整形数,表示字段的序号。
PutCollect 函数的 pvar 参数表示要写入的变量值。

⑷ AddNew 方法:使用该方法创建和初始化新记录。使用该方法可以使用参数,直接指定要添加的新纪录,
也可以不指定参数,而在后面使用 PutCollect 方法修改新记录,使用 Update 方法保存新记录。

⑸ Update 方法:该方法保存自调用 AddNew 方法以来或更改现有记录中的任何字段值以来所做的所有更改。
===================================================
③、使用记录集对象的过程步骤:
⑴ 定义 _RecordsetPtr 型变量;
⑵ 调用其 Open 方法,打开一个数据集;
⑶ 可以使用 GetCollect 方法获取记录的字段值;
⑷ 使用 Move 系列方法实现记录集的遍历;
⑸ 关闭记录集。
===================================================
④、主对话框 ListCtrl 控件的初始化:
  1. void CRentMgrDlg::InitListCtrl()
  2. {
  3.         HRESULT hr;
  4.         _RecordsetPtr pRentRecordset;
  5.         hr = pRentRecordset.CreateInstance(__uuidof(Recordset));
  6.         if (FAILED(hr)) {
  7.                 MessageBox(_T("创建记录集对象失败."));
  8.                 return;
  9.         }

  10.         CString strSQL;
  11.         strSQL = _T("SELECT * FROM tbRentInfo");
  12.         try{
  13.                 hr = pRentRecordset->Open(_variant_t(strSQL), m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
  14.                 if (SUCCEEDED(hr)) {
  15.                         _variant_t var;
  16.                         CString strValue;
  17.                         int curItem = 0;
  18.                         while(!pRentRecordset->GetadoEof()){
  19.                                 var = pRentRecordset->GetCollect((long)0);
  20.                                 if (var.vt != NULL)
  21.                                         strValue = (LPCTSTR)_bstr_t(var);
  22.                                 m_rentInfoList.InsertItem(curItem, strValue);

  23.                                 var = pRentRecordset->GetCollect(_T("sName"));
  24.                                 if (var.vt != NULL)
  25.                                         strValue = (LPCTSTR)_bstr_t(var);
  26.                                 m_rentInfoList.SetItemText(curItem, 1, strValue);

  27.                                 var = pRentRecordset->GetCollect(_T("sDVDID"));
  28.                                 if (var.vt != NULL)
  29.                                         strValue = (LPCTSTR)_bstr_t(var);
  30.                                 m_rentInfoList.SetItemText(curItem, 2, QueryDVDName(strValue));

  31.                                 var = pRentRecordset->GetCollect(_T("sDate"));
  32.                                 if (var.vt != NULL)
  33.                                         strValue = (LPCTSTR)_bstr_t(var);
  34.                                 m_rentInfoList.SetItemText(curItem, 3, strValue);

  35.                                 pRentRecordset->MoveNext();
  36.                                 curItem++;
  37.                         }
  38.                 }else{
  39.                         MessageBox(_T("打开结果记录集失败."));
  40.                         return;
  41.                 }
  42.         }
  43.         catch(_com_error *e){
  44.                 MessageBox(e->ErrorMessage());
  45.                 return;
  46.         }

  47.         pRentRecordset->Close();
  48.         pRentRecordset = NULL;
  49. }
复制代码


涉及到的另外一个函数:QueryDVDName 下节课讲解。
功能是根据DVD的ID获取DVD的名字。
===================================================
※※※ 小作业:
1、掌握记录集对象的使用方法;
2、实现 QueryDVDName 函数的功能,下节课给源码。
------------------------------------- End -------------------------------------------

相关课程演示细节还请观看视频教程!
本套教程由VC驿站原创,提供视频教程+售后答疑服务!
VC驿站Vip会员售后答疑截图【持续更新】:https://www.cctry.com/thread-288054-1-1.html
教程介绍及详情请见:https://www.cctry.com/static/vip/index.html
VC驿站Vip会员详情请见:https://www.cctry.com/static/vip/index.html




上一篇:VC++高级班之数据库篇-[8,9]创建ADO与数据库的连接
下一篇:VC++高级班之数据库篇-[11]查询功能的实现

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2018-11-19 22:37

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表