2024年2月20日发(作者:)
RecordCount 属性返回指示 Recordset 中记录数目的 Long 值。用 RecordCount 属性可查找 Recordset 对象中的记录数目。如果 ADO 无法确定记录数目或者提供者或游标类型不支持 RecordCount,则该属性返回 -1。读取已关闭的 Recordset 的 RecordCount 属性将产生错误。
Recordset 属性取决于提供者的功能和游标类型。对于仅向前游标,RecordCount 属性将返回 -1;对于静态或键集游标,将返回实际计数;而对于动态游标,则返回 -1 或实际计数,这取决于数据源。
在检验数据中介绍的范例 Recordset 由于仅向前游标被打开将返回 –1。为了使用
RecordCount 属性,您需要利用更先进的游标(静态或键集)打开 Recordset。
在某些情况下,您的提供者或游标在首先从数据源提取所有的记录之前无法提供
RecordCount 值。若要强制执行这种类型的记录提取,请在调用 RecordCount 之前调用
Recordset 的 MoveLast 方法。
以上是ADO官方手册的描述
对记录集计数有以下几个方法
1.直接读取recordcount
m_Record->Open(_T("SQL命令"), _variant_t((IDispatch *)m_Connection, true),
adOpenStatic, adLockReadOnly, adCmdText);
int n = m_Record->RecordCount; //得到记录条数
2.遍历
3.先select count(*) as cc from table1,然后再select * from table1
第一种方法,直接读取recordcount,最简单,但是有前提,游标位置要事先指定为客户端游标,游标类型事先指定为静态游标和Keyset游标,才能够稳定的使用该属性。使用connection->execute的方法得到记录集的游标类型依赖于数据库和,connection自身的游标位置属性,有时候返回的是只读向前的游标类型,这里取得的记录集recordcount属性是-1,所以一旦要使用这种方法,请在获取记录集的时候使用recordset的open方法,并事先明确指定游标位置,和游标类类型
第二种方法,遍历,遍历的方法,可以使用movenext来遍历计数,但目前很多人封装的ADO类获取记录集的方式是从connection->execute得到,得到的记录集可能是只读向前的游标,在遍历的时候是不可以使用movefirst,movelast,move等方法,只能使用movenext方法,所以要想使用所有的move方法,就必须使用明确的游标类型的记录集来open而不是从execute中得到。所以目前见到的多数ADO封装类经常在这里出现异常。大家使用的时候必须要进行相应的修改
第三种方法,是兼容性比较好,不需要考虑游标类型不确定的因素。但是代码量稍多
游标中只读向前的游标是最快的,性能最好的,但如果想在movenext遍历记录集之前获取
记录数就必须采用第三种方法。
服务端游标和客户端游标到底谁的性能快,取决于需求和系统实际的情况,以及数据库驱动对游标的支持程度。
以下来自官方手册,大家可以自行体会
游标位置的重要性
每个游标都使用临时资源来持有其数据。这些资源可以是内存、磁盘分页文件、临时磁盘文件,甚至是数据库中的临时存储区。当这些资源位于客户端计算机上时,游标称为“客户端”游标。当这些资源位于服务器上时,游标称为“服务器端”游标。
客户端游标
在 ADO 中,通过使用 adUseClient CursorLocationEnum 来调用客户端游标。利用非键集的客户端游标,服务器将整个结果集通过网络发送给客户端计算机。客户端计算机提供并管理游标和结果集所需要的临时资源。客户端应用程序可以浏览整个结果集,以确定它需要哪些行。
如果静态的和键集驱动的客户端游标包括的行数太多,那么,这些游标可能给工作站带来较沉重的负载。由于所有游标库都能够生成包含数千行的游标,所以,为获取大量行集而设计的应用程序有可能性能不佳。当然,也会有例外。对于某些应用程序来说,大型客户端游标可能完美好用,并且性能可能不成问题。
客户端游标的一个显然的好处是快速响应能力。结果集已下载到客户端计算机之后,浏览所有行的速度会非常快。一般来说,如果使用客户端游标,应用程序的可伸缩性更好,这是因为游标对资源的需求由每个单独的客户端而不是服务器来解决。
服务器端游标
在 ADO 中,通过使用 adUseServer CursorLocationEnum 来调用服务器端游标。通过服务器端游标,服务器使用由服务器计算机所提供的资源来管理结果集。服务器端游标只通过网络返回所请求的数据。该类型的游标有时可以提供比客户端游标更好的性能,尤其是存在过度拥挤的网络通信问题时。
但必须指出的是,对于每个活动客户端来说,服务器端游标很容易耗费宝贵的服务器资源(至少目前是这样)。因此,必须相应地进行计划,确保服务器硬件能够管理活动客户端所请求的所有服务器端游标。另外,服务器端游标速度缓慢,因为它只提供单行访问,就是说,没有批游标可用。
当插入、更新或删除记录时,服务器端游标是有用的。使用服务器端游标,在同一个连接上就可以有多个活动语句。
Open 方法 (ADO Recordset)
打开游标。
语法
Source,
ActiveConnection,
CursorType,
LockType,
Options
参数
Source
可选,变体型,计算 Command 对象的变量名、SQL 语句、表名、存储过程调用或持久 Recordset
文件名。
ActiveConnection
可选。变体型,计算有效 Connection 对象变量名;或字符串,包含 ConnectionString
参数。
CursorType
可选,CursorTypeEnum 值,确定提供者打开 Recordset 时应该使用的游标类型。可为下列常量之一(参阅 CursorType 属性可获得这些设置的定义)。
常量
说明
AdOpenForwardOnly
(默认值)打开仅向前类型游标。
AdOpenKeyset
AdOpenDynamic
AdOpenStatic
打开键集类型游标。
打开动态类型游标。
打开静态类型游标。
LockType
可选。确定提供者打开 Recordset 时应该使用的锁定(并发)类型的 LockTypeEnum 值,可为下列常量之一(参见 LockType 属性可获得详细信息)。
常量
AdLockReadOnly
AdLockPessimistic
说明
(默认值)只读 — 不能改变数据。
保守式锁定(逐个) — 提供者完成确保成功编辑记录所需的工作,通常通过在编辑时立即锁定数据源的记录。
AdLockOptimistic
开放式锁定(逐个) — 提供者使用开放式锁定,只在调用Update 方法时才锁定记录。
AdLockBatchOptimistic
开放式批更新—用于批更新模式(与立即更新模式相对)。
Options
可选,长整型值,用于指示提供者如何计算 Source 参数(如果它代表的不是 Command 对象),或从以前保存 Recordset 的文件中恢复 Recordset。可为下列常量之一(参见 CommandType 属性可获得该列表中前五个常量的详细说明)。
常量
adCmdText
adCmdTable
说明
指示提供者应该将 Source 作为命令的文本定义来计算。
指示 ADO 生成 SQL 查询以便从在 Source 中命名的表中返回所有行。
adCmdTableDirect
adCmdStoredProc
adCmdUnknown
adCmdFile
指示提供者更改从在 Source 中命名的表中返回所有行。
指示提供者应该将 Source 视为存储过程。
指示 Source 参数中的命令类型为未知。
指示应从在 Source 中命名的文件中恢复保留(保存的)Recordset。
adAsyncExecute
adAsyncFetch
指示应异步执行 Source。
指示在提取 Initial Fetch Size 属性中指定的初始数量后,应该异步提取所有剩余的行。如果所需的行尚未提取,主要的线程将被堵塞直到行重新可用。
adAsyncFetchNonBlocking
指示主要线程在提取期间从未堵塞。如果所请求的行尚未提取,当前行自动移到文件末尾。
说明
使用 Recordset 对象的 Open 方法可打开代表基本表、查询结果或者以前保存的 Recordset
中记录的游标。
使用可选的 Source 参数指定使用下列内容之一的数据源:Command 对象变量、SQL 语句、存储过程、表名或完整的文件路径名。
如果 Source 是文件路径名,它可以是完整路径(“c:”)、相对路径(“..”)或 URL(“files/”)。
ActiveConnection
参数对应于 ActiveConnection 属性,并指定在哪个连接中打开 Recordset 对象。如果传送该参数的连接定义,则 ADO 使用指定的参数打开新连接。可以在打开 Recordset 之后更改该属性的值以便将更新发送到其他提供者。或者可以将该属性设置为 Nothing(在 Microsoft Visual Basic 中)以便将 Recordset 与所有提供者断开。
对于直接对应于 Recordset 对象属性的参数(Source、CursorType 和 LockType),参数和属性的关系如下:
在 Recordset 对象打开之前属性是读/写。
除非在执行 Open 方法时传送相应的参数,否则将使用属性设置。如果传送参数,则它将覆盖相应的属性设置,并且用参数值更新属性设置。
在打开 Recordset 对象后,这些属性将变为只读。
注意 对于其 Source 属性被设置为有效 Command 对象的 Recordset 对象,即使 Recordset 对象没有打开,ActiveConnection 属性也是只读的。
如果在 Source 参数中传送 Command 对象并且同时传递 ActiveConnection 参数,那么将产生错误。
Command 对象的 ActiveConnection 属性必须已经设置为有效的 Connection 对象或者连接字符串。
如果在 Source 参数中传送的不是 Command 对象,那么可以使用 Options 参数优化对
Source 参数的计算。如果没有定义 Options 则性能将会降低,原因是 ADO 必须调用提供者以确定参数是否为 SQL 语句、存储过程或表名。如果已确定所用的 Source 类型,则可以设置 Options 参数以指示 ADO 直接跳到相关的代码。如果 Options 参数不匹配 Source 类型,将产生错误。
如果不存在与 Recordset 关联的连接,Options 参数的默认值将为 adCmdFile。这是持久
Recordset 对象的典型情况。
如果数据源没有返回记录,那么提供者将 BOF 和 EOF 属性同时设置为 True,并且不定义当前记录位置。如果游标类型允许,仍然可以将新数据添加到该空 Recordset 对象。
在打开的 Recordset 对象上完成操作时,可使用 Close 方法释放任何相关的系统资源。关闭对象并非将它从内存中删除,可以更改它的属性设置并且在以后使用 Open 方法再次将其打开。要将对象从内存中完全删除,可将对象变量设置为
Nothing。
在设置 ActiveConnection 属性之前调用不带操作数的 Open,可通过将字段追加到
Recordset Fields 集合创建 Recordset 的实例。
如果已经将 CursorLocation 属性设置为 adUseClient,就可以采用两种途径之一异步检索行。建议使用的方法是将 Options 设置为 adAsyncFetch。或者,可以使用在 Properties 集合中的“异步行集合处理”动态属性,但如果未将 Options 参数设置为 adAsyncFetch,则可能丢失相关的被检索事件。
注意 在 MSRemote 提供者中的背景提取仅能通过 Open 方法的
Options 参数得到支持。
参数说明:
Source 可选,变体型,计算 Command 对象的变量名、SQL 语句、表名、存储过程调用或持久 Recordset 文件名。 ActiveConnection 可选。变体型,计算有效 Connection 对象变量名;或字符串,包含 ConnectionString 参数。
CursorType 可选,CursorTypeEnum 值,确定提供者打开 Recordset 时应该使用的游标类型。
可为下列常量之一(参阅 CursorType 属性可获得这些设置的定义)。
值 常量 说明
--- ------------------- -----------------------
0 AdOpenForwardOnly 默认值)打开仅向前类型游标。
1 AdOpenKeyset 打开键集类型游标。
2 AdOpenDynamic 打开动态类型游标。
3 AdOpenStatic 打开静态类型游标。
LockType 可选。确定提供者打开 Recordset 时应该使用的锁定(并发)类型的 LockTypeEnum 值,可为下列常量之一(参见 LockType 属性可获得详细信息)。
值 常量 说明
--- -------------------------------- -----------------------
1 AdLockReadOnly (默认值)只读 — 不能改变数据。
2 AdLockPessimistic 保守式锁定,提供者完成确保成功编辑记录所需的工作,通常通过在编辑时立即锁定数据源的记录。
3 AdLockOptimistic 开放式锁定(逐个) — 提供者使用开放式锁定,只在调用Update 方法时才锁定记录。
4 AdLockBatchOptimistic 开放式批更新—用于批更新模式(与立即更新模式相对)。


发布评论