ADO:使用记录集对象Recordset 查询数据库中的数据

ADO操作Oracle数据库 专栏收录该内容
16 篇文章 0 订阅
在 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 方法保存新记录。

⑸ 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;
}

  • 1
    点赞
  • 0
    评论
  • 12
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:Age of Ai 设计师:meimeiellie 返回首页

打赏作者

小米的修行之路

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值