标题:[转帖]VB处理数据库时求数据表记录总数的最佳方法
只看楼主
五月天
Rank: 1
等 级:新手上路
帖 子:181
专家分:0
注 册:2004-4-20
 问题点数:0 回复次数:3 
[转帖]VB处理数据库时求数据表记录总数的最佳方法

---- ---- VB主要处理的是MDB格式的数据库,但就在这方面,它就偏偏出了差错,先看看下例:

Dim db As Database Dim rs As Recordset Set db = OpenDatabase(App.Path & "\zzr.mdb") Set rs = db.OpenRecordset("test") Debug.Print rs.RecordCount

---- ---- 此例假设在应用程序目录下有一个名为"zzr.mdb"的数据库,而且它里边有一个名为"test"的表,此程序的目的就是求出该表中的记录的总数。此处用到的是"表"对象的RecordCount属性,这样用在一般性况下是正确的,但并不能保证在所有的情况下都能得出正确的结果,比如说表中的数据量很大,或者是数据库受到过什么损害等等。如果碰到这种情况,我们可以换一个角度来处理。请看下面的程序: Dim db As Database Dim rs As Recordset Dim Num As Long Set db = OpenDatabase(App.Path & "\zzr.mdb") Set rs = db.OpenRecordset("test") Num = 0 rs.MoveFirst Do While Not rs.EOF() Num = Num + 1 rs.MoveNext Loop Debug.Print Num

---- ---- 这样,最后得到的Num即为正解结果,这种方法的思路是从表的开始处一直顺序走到结尾,就可以"数"出表中到底有多少条记录。这种方法看起来很笨,但是它却是一个相当准确的方法,大家不防可以试一下。 ---- 再看笔者的说法:

---- 先看上面一行程序:Debug.Print rs.RecordCount,VB5在读取数据表时并非一次性将全部记录均读入内存(想想看如果有一个表,里面有一百万个记录甚至一亿个或更多,要想全部读入内存,你的机器能承受得了吗?),只是先读入一部分(在下认为这是VB的优异这处),recordset对象并非表的全部记录,只是已读入内存的部分,故用rs.recordcount得到的不是表的记录总数。

---- 再看上面程序的改良部份:

Do While Not rs.EOF() Num = Num + 1 rs.MoveNext Loop Debug.Print Num

---- 在下用十万个记录的表对上面这段程序做了个测试,结果花了六分半钟(intel 166,32M内存),如此的等待,阁下有耐心无?请看在下的对策: ---- 假设数据表已打开,用

rs.Recordset.MoveLast '将指针移到表的最后一笔记录 debug.print rs.Recordset.RecordCount 即可得出正确结果。

或者用下一种方法亦可

rs.Recordset.MoveLast debug.print rs.Recordset.AbsolutePosition+1 '调用绝对位置,因vb的第一笔记录是由零算起,故要+1。

[此贴子已经被作者于2004-06-17 16:13:43编辑过]

搜索更多相关主题的帖子: 数据库 转帖 记录 总数 
2004-06-17 16:02
firechun
Rank: 1
等 级:新手上路
帖 子:135
专家分:0
注 册:2004-4-13
得分:0 

补充一下:楼上的方法是针对DAO的,对ADO来说,用adOpenKeyset,adOpenKeyset 打开的记录集,可以直接获得RecordCount


本人在编程中国发表的所有文章,除特别说明外均属原创,转载时请注明作者编程中国
2004-06-18 09:06
五月天
Rank: 1
等 级:新手上路
帖 子:181
专家分:0
注 册:2004-4-20
得分:0 
谢谢firechun的补充

啦~啦~啦~~
2004-06-19 19:40
gandy
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2004-12-9
得分:0 
我认为在rs.movelast之前应加rs.movefirst.
2004-12-09 11:23



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-2602-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.067540 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved