单独使用CRecordSet

原创 2000年11月22日 09:51:00
闻怡洋 wyy_cq@21cn.com http://www.vchelp.net/

一般情况下AppWizard会在数据库应用程序中自动产生CRecordset的派生类,并将派生类和某个数据源中的表联系起来也可以和视图上的子窗口联系起来。但是有时这样做会影响到程序的灵活性,这时候我们可以单独使用CRecordSet类。利用CRecordSet类我们可以执行SQL语句,并可以读出结果集中数据。

首先我们需要包含头文件afxdb.h,可以将#include 添加到stdafx.h文件中。此外在使用CRecordset时必须有一个又一个CDatabase对象,该对象的作用是管理数据源连接。然后可以产生一个CRecordset对象,利用BOOL CRecordset::Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, DWORD dwOptions = none )可以执行SQL语句。

但执行成功后,可以调用以下的函数滚动光标,读取数据。

MoveFirst 移动光标到第一条记录处
MoveNext 移动光标到后一条记录处
MovePrev 移动光标到前一条记录处
MoveLast 移动光标到最后一条记录处
IsBOF 检测光标是否在第一条记录上
IsEOF 检测光标是否在最后一条记录上
GetFieldValue 得到结果中数据
下面是具体代码:
/*
假设CDatabase m_dbConn为成员变量
假设有一个表有如下SQL语句产生:CREATE TABLE table1(loc_id not null)
*/
void CYourClass::ConnectToDB()
{//连接数据库
	BOOL fOK = m_dbConn.Open("test");
	TRACE("connect fOK=%d/n",m_dbConn);
}

void CYourClass::Select()
{//执行SELECT语句
	CRecordset rec(&m_dbConn);
	BOOL fOK = rec.Open(CRecordset::forwardOnly,"select loc_id from table1 order by loc_id");
	TRACE("select fOK = %d/n",fOK);
	TRACE("返回的列数为:%d/n",rec.GetRowsetSize());
	CString szResult;
	while(!rec.IsEOF())
	{
		rec.GetFieldValue((int)0,szResult);
		rec.MoveNext();
		TRACE("fetch : %s/n",szResult);
	}
}

此外CRecordset::GetFieldValue有很多种原型,你可以通过指定列位置或是字段名来获取数据:

void GetFieldValue( LPCTSTR lpszName, CDBVariant& varValue, short nFieldType = DEFAULT_FIELD_TYPE );

void GetFieldValue( short nIndex, CDBVariant& varValue, short nFieldType = DEFAULT_FIELD_TYPE );

void GetFieldValue( LPCTSTR lpszName, CString& strValue );

void GetFieldValue( short nIndex, CString& strValue );

如果使用CDBVariant类型变量来获取结果,你可以得到任何类型的结果。在CDBVariant::m_dwType成员变量中记录了该变量所包含的数据类型,根据该变量的值你可以确定数据类型并引用CDBVariant对象中的相应成员变量。下载本文示范代码

CRecordset::Open

virtual BOOL Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE,                    LPCTSTR lpszSQL = N...
  • shizhandong50
  • shizhandong50
  • 2013年10月21日 09:49
  • 938

利用支持ODBC的CRecordset类实现对数据库的操作

1.MFC中的ODBC类 主要有CDatabase、CRecordset、CRecordview、CDBException、CFieldExchange。这些类封装了ODBC SDK函数,可以很方便...
  • rayborn1105
  • rayborn1105
  • 2011年12月09日 01:24
  • 6681

CDatabase类和CRecordset类关于执行Sql语句的用法区别

1 CRecordset类通过open(..)可以执行sql语句,并且将记录集存在对象中2 CDatabase类通过ExecuteSql(..)执行创建 插入,删除,修改等不返回记录集操作第一种用法:...
  • kivcare
  • kivcare
  • 2009年12月08日 22:07
  • 3644

CRecordset类

CRecordset类代表一个记录集,是MFC的ODBC类中最重要、功能最强大的类。 #include 1.      动态集、快照、光标和光标库 在多任务操作系统或网络环境中,多个用户可以共...
  • elcoteq983
  • elcoteq983
  • 2011年11月22日 15:42
  • 18815

CRecordSet类用法

要实现对结果集的数据操作,就要用到CRecordSet类。CRecordSet类定义了从数据库接收或者发送数据到数据库的成员变量,CRecordSet类定义的记录集可以是表的所有列,也可以是其中的一列...
  • u011392772
  • u011392772
  • 2016年09月27日 22:38
  • 571

CRecordSet使用详解

一、CRecordSet类中有一个成员变量m_pDatabase,它是指向数据库类的指针。可以通过以下方式将数据集关联到相应的数据库上: 1.CRecordSet rs;    rs.m_...
  • MFC_tgz
  • MFC_tgz
  • 2014年08月30日 11:42
  • 1145

单独使用CRecordSet

闻怡洋 wyy_cq@21cn.com http://www.vchelp.net/ 一般情况下AppWizard会在数据库应用程序中自动产生CRecordset的派生类,并将派生类和某个数据源中的表...
  • ghj1976
  • ghj1976
  • 2000年11月22日 09:51
  • 2573

CRecordset::IsBOF和CRecordset::IsEOF区别

IsBOF 作用:如果记录集定位于第一个记录之前,返回非零。此时没有当前记录。 BOOL IsBOF( ) const; 返回值: 如果记录集没有记录,或者你已经向前游动到第一...
  • u010879420
  • u010879420
  • 2016年10月11日 23:11
  • 370

使用CRecordset update()函数不能更新

最近做一个有数据库编程的项目,使用了CRecordset类。总结下心得,方便自己,方便后学的人。     在中介绍了有关CRecordset类的具体用法。那么有以下两个 问题:    1.CRe...
  • yongan1006
  • yongan1006
  • 2016年11月15日 21:50
  • 423

VC++下ODBC的编程

 VC++下ODBC的编程摘要本文在介绍了ODBC(开放性数据库连接,Open  DataBase  Connectivity)运行机制的基础上,着重讨论了VisualC++2.0下利用ODBCAPI...
  • upczap
  • upczap
  • 2007年12月11日 20:10
  • 783
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单独使用CRecordSet
举报原因:
原因补充:

(最多只允许输入30个字)