ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 11340|回复: 19

[讨论] 探讨如何获得RECORDSET正确记录数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-8-12 11:39 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 autumnalRain 于 2015-8-12 12:06 编辑

RecordCount是RECORDSET的一个属性,返回Recordset对象中记录的当前数目。
但为什么象我这样的新手,在使用RECORDCOUNT获取数据集的行数时,经常返回-1,通过浏览贴子,发现其实是对于RECORDSET的用法不了解所致。
浏览了不少求助贴子,也都是求助关于如何获得RECORDCOUNT的值的,也都是在自己测试时得到-1。如
http://club.excelhome.net/forum.php?mod=viewthread&tid=168546
http://club.excelhome.net/thread-174745-1-1.html
……
本人非电脑专业并且还是学文,所以对此也是不得而知。所以在此抛出此贴,希望集思广义,更希望有更多的老师加以指点。
蓝色幻想老师也说过,如果想系统性把SQL学精,没有一年两年是不行的,那也只是针对优秀的人,象我自认是学不会的。所以有了老师您的指导才能让我等茅塞顿开。



一、示例:依据【查询清单】内容查询【项目名称】返回【查询结果】的内容。并检验返回记录是否正确
1、数据源-【项目名称】
2、【查询清单】
3、【查询结果】
4RECORDCOUNT返回值

数据源.png
查询清单.png
查询结果.png
返回记录集的个数.png

如何得到记录集的个数.rar

22.37 KB, 下载次数: 85

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-12 11:40 | 显示全部楼层
本帖最后由 autumnalRain 于 2015-8-12 11:53 编辑

二、具体实现过程:

1、获得【查询清单】

Private Sub Worksheet_Activate()
     Cells.Clear
     [a1] = "凭证号"
     [B1] = "项目名称"
    Dim cnn As Object, SQL
    Set cnn = CreateObject("ADODB.Connection")
    cnn.Open "provider=microsoft.ACE.OLEDB.12.0;extended properties='Excel 12.0;hdr=yes';data source=" & ThisWorkbook.FullName
    SQL = "select DISTINCT 凭证号,项目名称 from [项目名称$] where 项目名称<>""采购"""
    [A2].CopyFromRecordset cnn.Execute(SQL)
    cnn.Close
    Set cnn = Nothing
End Sub

2、获取查询结果并返回记录数

Sub 查询结果()

Dim I As Integer

Dim K As Integer

Dim Rmax As Integer

Dim SQL As String

Dim conn As String

Dim ADOConn As Object

Dim ADORst As Object

Set ADOConn = CreateObject("ADODB.Connection")

Set ADORst = CreateObject("ADODB.Recordset")

conn = "provider=microsoft.ACE.OLEDB.12.0;extended properties='Excel 12.0;hdr=yes';data source=" & ThisWorkbook.FullName

Rmax = Sheets("查询清单").Range("a1").CurrentRegion.Rows.Count

For I = 2 To Rmax

SVoucher = Sheets("查询清单").Cells(I, 1)

SProject = Sheets("查询清单").Cells(I, 2)

Sheets("查询结果").Cells.Clear

SQL = "select 凭证号,名称,规格,单位,数量,单价,金额,项目名称 from [项目名称$] where [凭证号]=""" & SVoucher & """ And [项目名称]= """ & SProject & """"请大家注意WHERE多条件并引用变量时如何表达

ADOConn.Open conn

ADORst.Open SQL, ADOConn, 3, 3’这里为什么要用3,3而不是其它大家讨论下

Debug.Print ADORst.RecordCount '辅助代码,用于得到记录集的行数以便和电子表格中的记录数核对是否返回值正确

For K = 0 To ADORst.Fields.Count - 1 ’获取字段值并写入单元格中

Sheets("查询结果").Cells(1, K + 1) = ADORst.Fields(K).Name

Next K

Sheets("查询结果").[A2].CopyFromRecordset ADORst

ADORst.Close

ADOConn.Close

Next I

Set ADORst = Nothing

Set ADOConn = Nothing

End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-12 11:40 | 显示全部楼层
三、说说CursorType参数

这是指打开的记录集的游标方式,和锁定方式

1、'光标

'Const adOpenForwardOnly = 0     ''游标只向前浏览记录,不支持分页、Recordset、BookMark

'Const adOpenKeyset = 1         ''键集游标,其他用户对记录说做的修改将反映到记录集中,但其他用户增加或删除记录不会反映到记录集中。支持分页、Recordset、BookMark

'Const adOpenDynamic = 2         ''动态游标功能最强,但耗资源也最多。用户对记录说做的修改,增加或删除记录都将反映到记录集中。支持全功能浏览(ACCESS不支持)。

'Const adOpenStatic = 3         ''静态游标,只是数据的一个快照,用户对记录说做的修改,增加或删除记录都不会反映到记录集中。支持向前或向后移动

2、锁定

'Const adLockReadOnly = 1        ''锁定类型,默认的,只读,不能作任何修改

'Const adLockPessimistic = 2     ''当编辑时立即锁定记录,最安全的方式

'Const adLockOptimistic = 3      ''只有在调用Update方法时才锁定记录集,而在此前的其他操作仍可对当前记录进行更改、插入和删除等

'Const adLockBatchOptimistic = 4 ''当编辑时记录不会被锁定,而更改、插入和删除是在批处理方式下完成的

3、以上几个游标类型将直接影响到Recordset对象所有的属性和方法,一般来说浏览数据用1,1,添加数据用1,2,修改删除数据用2,3"具体区别请参考:

http://www.knowsky.com/473.html

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-12 11:42 | 显示全部楼层
本帖最后由 autumnalRain 于 2015-8-12 13:28 编辑

四、也有老师说:
“……要想使用recordcount 得到记录个数好像一定得设置引用才行,即使你采用了 adOpenKeyset 或 adOpenStatic 参数也不行……试验结果:要使用 adLockPessimistic 参数,也是一定要设置引用。”
示例代码经验证可以得到正确的记录数字,所以我不太理解这是的“设置引用”是怎么回事儿,是前期绑定还是其它的什么 ?也请老师指点。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-12 11:43 | 显示全部楼层
本帖最后由 autumnalRain 于 2015-8-12 12:23 编辑

--题外话:

也因为想了解它,我加了AMULEE老师的群,也因为太想了解它,却遭到了其他几个人网络围殴。说本人是伸手党,他们当初如何自学才到达现在这个水平。本人愚蠢,自学不能没有老师。更有一常姓讲师,讲话时自称爷,实在让人出离愤怒。无奈,只能愤而退群。对这次经历记忆犹新。所以我希望出书或开讲的老师,您的师德应该象你的专业一样优秀。不要再伤害您的读者。

TA的精华主题

TA的得分主题

发表于 2015-8-12 12:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
哎,没办法,大神们既然是大神,那一定不是学了一天两天,除此之外,既然是大神,不用说,事情绝对特别多。最重要的一点,他们大多都是在闲暇时间,能去写的,一般都是不能太长的内容。
你要是问,最好只问最核心的问题,或者让提供思路,想一个完整功能给你写下来,这个事就太难了。
关键一点,时间代价呢,所以说他们只能闲暇时间,并且在一定的知识范围内,去帮助别人。
既然属于求教,没什么付出的话,别人也没什么收获,还得需要消耗一定时间的话。那就要非常的礼貌了。
并且在这种情况下,别人回复你,你可以跪谢了,不回复你,别人也完全没问题。并不是说版主,什么什么就一定要帮每个人处理每个问题

我问的所有问题,也不是每个问题都一定有人给我答案,很多高手都会。
平常心对待好了,一个思路,别想着每个问题,作为版主就一定有回答你的必要,人家可选回复人,回复题目。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-12 12:11 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 autumnalRain 于 2015-8-12 16:21 编辑
范德萨 发表于 2015-8-12 12:05
哎,没办法,大神们既然是大神,那一定不是学了一天两天,除此之外,既然是大神,不用说,事情绝对特别多。 ...

理解。
不想回答或是没有时间或者觉得没有共性不必回复其实完全不用回复。这点我看得明白。我从没有因为老师不回答而不快。换位思考也理当如此。
若不是百度多次仍找不到想要的答案,也不会去群里求助。但既然开群,有人求教并不为过。而且作为书的作者,面对读者求助解答下应该也是无可厚非?最起码在读者很诚恳的情况下不要用反问句说:我为什么应该……
只所以到最后愤怒,也是因为有讲师自称爷而还有其他的讲师说“他又没让你叫爷爷”,我只能说帮腔的人骨子里奴性太重。
另外本人不同意什么跪谢的说法,不卑不亢也许更能体现老师的尊严和价值.
网络上跪求什么的本人其实也十分反感。
求教,最起码要相互尊重,尊重自己,更尊重他人!



TA的精华主题

TA的得分主题

发表于 2015-8-12 14:40 | 显示全部楼层
想获得RecordCount属性的值与ADO的两个属性有关

属性1:CursorLocation属性,该属性设置查询结果的存储位置
该属性有两个值,
1、AdUseServer(值为2),默认值,表示使用OLEDB提供程序或数据库来管理查询结果。
2、AdUseClient(值为3),表示使用ADO临时表引擎来管理查询结果
如需获得RecordCount属性值,该项应选择AdUseClient(值为3)。
在一个recordset对象没有打开之前,可以设置该值,如果不设置该值,则会继承connect对象中的该属性值。因此也可以直接设置connection对象的该值。

属性2:CursorType属性,该属性设置recordset的临时表类型
该属性有4个值,楼主已经在上面介绍了,只有当属性设置为adOpenStatic(值为3)和adOpenKeyset(值为1)时,才可以获得recordcount属性值。
我以前的一个贴子有专门的介绍,有兴趣可以看看。http://club.excelhome.net/thread-530742-1-1.html

楼主代码
ADORst.Open SQL, ADOConn, 3, 3
中前一个3指的就是CursorLocation=adOpenStatic

将代码改为
ADORst.Open SQL, ADOConn, adOpenStatic, adLockOptimistic
可提高代码的可读性


想获得RecordSet的RecordCount属性可参考下面的代码
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
   
    With rs
        .CursorLocation = adUseClient
        .CursorType = adOpenStatic
        .Open Sql, cn
    End With

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-8-12 15:13 | 显示全部楼层
本帖最后由 coby001 于 2015-8-12 15:33 编辑

RecordCount是RECORDSET的一个属性,返回Recordset对象中记录的当前数目。

要获得记录数量,不一定非要用RecordCount。

可以用SQL获得记录总数

Select count(*) as RecCnt From TabName Where 条件

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-12 16:13 | 显示全部楼层
lbpp 发表于 2015-8-12 14:40
想获得RecordCount属性的值与ADO的两个属性有关

属性1:CursorLocation属性,该属性设置查询结果的存储 ...

感谢。
也有老师说:
“……要想使用recordcount 得到记录个数好像一定得设置引用才行,即使你采用了 adOpenKeyset 或 adOpenStatic 参数也不行……试验结果:要使用 adLockPessimistic 参数,也是一定要设置引用。”
我不太理解这是的“设置引用”是怎么回事儿,是前期绑定还是其它的什么 ?也请老师指点。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-5 03:48 , Processed in 0.055353 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表