在 ADO 程序开发中,记录集对象 Recordset 对象代表一个表的记录集合或者是一个SQL命令或是存储过程的执行结果。简单的说,记录集实际上缓存了从数据库获得的记录,应用程序可以从记录集中获得每条记录的字段。
①、记录集对象 Recordset 的属性:
⑴ RecordCount 属性:返回记录集中记录的个数;
⑵ BOF、EOF 属性:
BOF 指示当前记录位置位于记录集对象的第一个记录之前;EOF 指示当前记录位置位于记录集对象的最后一个记录之后。他们都是布尔值,即:只能为 True 或者 False。他们被用于判断记录指针是否越界,这非常有用,如果越界操作,程序运行会产生错误。如果没有打开记录集对象,BOF 和 EOF 都被设置为 True,RecordCount 属性值为 0;如果打开的记录集对象中至少包含一条记录,则第一条记录为当前记录,BOF 和 EOF 属性都为 False。
⑶ AbsolutePosition 属性:指定记录集对象当前记录序号的位置;
⑷ ActiveConnection 属性:该属性指定记录集对象当前所属的 Connection 对象;
===================================================
②、记录集对象 Recordset 的方法:
⑴ Open 方法:
HRESULT Open(
const _variant_t & Source,
const _variant_t & ActiveConnection,
enum CursorTypeEnum CursorType,
enum LockTypeEnum LockType,
long Options
)
★ 参数 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 方法保存新记录。
①、记录集对象 Recordset 的属性:
⑴ RecordCount 属性:返回记录集中记录的个数;
⑵ BOF、EOF 属性:
BOF 指示当前记录位置位于记录集对象的第一个记录之前;EOF 指示当前记录位置位于记录集对象的最后一个记录之后。他们都是布尔值,即:只能为 True 或者 False。他们被用于判断记录指针是否越界,这非常有用,如果越界操作,程序运行会产生错误。如果没有打开记录集对象,BOF 和 EOF 都被设置为 True,RecordCount 属性值为 0;如果打开的记录集对象中至少包含一条记录,则第一条记录为当前记录,BOF 和 EOF 属性都为 False。
⑶ AbsolutePosition 属性:指定记录集对象当前记录序号的位置;
⑷ ActiveConnection 属性:该属性指定记录集对象当前所属的 Connection 对象;
===================================================
②、记录集对象 Recordset 的方法:
⑴ Open 方法:
HRESULT Open(
const _variant_t & Source,
const _variant_t & ActiveConnection,
enum CursorTypeEnum CursorType,
enum LockTypeEnum LockType,
long Options
)
★ 参数 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 方法以来或更改现有记录中的任何字段值以来所做的所有更改。
使用记录集对象查询数据库中的数据两种方法:
1、
/* 功能:“查询”数据库tbRentInfo表,将表中的数据显示在列表控件中 查询方法:使用“记录集对象”的GetCollect()函数 */ void CRentMgrDlg::InitListCtrl() { /*创建并实例化一个记录集对象*/ HRESULT hr; _RecordsetPtr pRentRecordset; hr = pRentRecordset.CreateInstance(__uuidof(Recordset)); if(FAILED(hr)) { MessageBox(_T("创建记录集失败!")); return; } /*组串:组织查询字符串*/ CString strsql; strsql = _T("SELECT * FROM tbRentInfo"); /*查询:打开记录集,并对记录进行循环遍历*/ try { hr = pRentRecordset->Open(_variant_t(strsql), m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); if (FAILED(hr)) { MessageBox(_T("打开记录集失败!")); return; } else { _variant_t var; CString strValue; int curItem = 0; while (!pRentRecordset->GetEndOfFile()) { /*采用列编号来获取当前记录集行的字段值*/ var = pRentRecordset->GetCollect((long)0); if (var.vt != NULL) strValue = (LPCTSTR)_bstr_t(var); m_rentInfoList.InsertItem(curItem, strValue); /*采用列名字来获取当前记录集行的字段值*/ var = pRentRecordset->GetCollect(_T("sName")); if (var.vt != NULL) strValue = (LPCTSTR)_bstr_t(var); m_rentInfoList.SetItemText(curItem, 1, strValue); var = pRentRecordset->GetCollect(_T("sDVDID")); if (var.vt != NULL) strValue = (LPCTSTR)_bstr_t(var); m_rentInfoList.SetItemText(curItem, 2, _T("你好啊")/*QueryDVDName(strValue)*/); var = pRentRecordset->GetCollect(_T("sDate")); if (var.vt != NULL) strValue = (LPCTSTR)_bstr_t(var); m_rentInfoList.SetItemText(curItem, 3, strValue); pRentRecordset->MoveNext(); curItem++; } } } catch(_com_error *e) { MessageBox(e->ErrorMessage()); return; } /*关闭记录集对象*/ pRentRecordset->Close(); pRentRecordset = NULL; }
2、
/* 功能:“查询”数据库tbRentInfo表,将表中的数据显示在列表控件中 查询方法:使用“记录集对象”的Fields域来获取结果 */ void CRentMgrDlg::InitListCtrl2() { /*创建并实例化一个记录集对象*/ HRESULT hr; _RecordsetPtr pRentRecordset; hr = pRentRecordset.CreateInstance(__uuidof(Recordset)); if (FAILED(hr)) { MessageBox(_T("实例化记录集对象失败!")); return; } /*组串:组织查询字符串*/ CString strsql; strsql = _T("SELECT * FROM tbRentInfo"); try { hr = pRentRecordset->Open(_variant_t(strsql), m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText); if (FAILED(hr)) { MessageBox(_T("打开记录集失败!")); return; } else { _variant_t var; CString strValue; int curItem = 0; while (!pRentRecordset->EndOfFile) { /*获得当前记录集(一行)的Fields集合,通过索引值获取Fields集合中的Field对象*/ /*Field对象可以认为是一个记录行中的一个字段,再获取Field的Value属性*/ var = pRentRecordset->Fields->GetItem(long(0))->GetValue(); if (var.vt != NULL) strValue = (LPCTSTR)_bstr_t(var); m_rentInfoList.InsertItem(curItem, strValue); var = pRentRecordset->Fields->GetItem(long(1))->GetValue(); if(var.vt != NULL) strValue = (LPCTSTR)_bstr_t(var); m_rentInfoList.SetItemText(curItem, 2, _T("你好啊")/*QueryDVDName(strValue)*/); var = pRentRecordset->Fields->GetItem(long(2))->GetValue(); if(var.vt != NULL) strValue = (LPCTSTR)_bstr_t(var); m_rentInfoList.SetItemText(curItem, 2, strValue); var = pRentRecordset->Fields->GetItem(long(3))->GetValue(); if(var.vt != NULL) strValue = (LPCTSTR)_bstr_t(var); m_rentInfoList.SetItemText(curItem, 3, strValue); curItem++; pRentRecordset->MoveNext(); } } } catch (_com_error *e) { MessageBox(e->ErrorMessage()); return; } pRentRecordset->Close(); pRentRecordset = NULL; }