1. VB 读取 Access 表记录总数到底难在哪如果你在用 VB6 或者 VBA 写 Access 相关的小工具迟早会遇到一个需求把某张表的记录总数读出来赋给一个变量然后拿去做分页、做进度条、做统计报表。听起来简单但真正动手时你会发现RecordCount这个属性经常返回 -1让人一头雾水。这个问题的根源在于游标类型。ADO 的Recordset默认使用服务端游标adUseServer这种游标是只进的数据库不会一次性把结果集全部拉回来所以它根本不知道总共有多少条记录RecordCount就返回 -1。只有切换到客户端游标adUseClientADO 才会把整个结果集缓存到本地这时RecordCount才是真实值。除了 ADO老项目里还大量存在 DAO 的写法。DAO 的Recordset用dbOpenSnapshot或dbOpenDynaset打开后RecordCount是直接可用的不需要额外设置游标。两种方式各有适用场景本文会把它们都讲清楚。另外很多朋友在开发过程中会借助 AI 辅助工具来生成或调试这类数据库代码。这时候一个稳定的模型调用通道就很重要TaoToken 提供的统一 Key 通道可以让你在多个模型之间切换不用为每个模型单独配置密钥后面我会给出具体的接入配置。这篇文章面向的是正在用 VB6、VBA 或 VB.NET 操作 Access 数据库的开发者尤其是那些被RecordCount -1卡住、或者想搞清楚 DAO 和 ADO 区别的人。读完你能直接复制代码跑起来也能知道报错时该往哪个方向排查。2. TaoToken 统一 Key 通道的前置准备在写数据库代码之前先花几分钟把 AI 辅助通道配好。我自己的习惯是写 Access 相关代码时遇到连接字符串记不清、SQL 语法拿不准直接让模型帮我生成骨架比翻文档快得多。TaoToken 的好处是一个 Key 能调多个模型不用在好几个平台之间来回切换。你需要做三件事第一注册并拿到 API Key。访问控制台地址https://taotoken.net/console登录后在 API Keys 页面创建一个新 Key。这个 Key 就是你的统一凭证后面所有模型调用都用它。第二确认你要用的模型。如果你只是偶尔问几个 SQL 问题用模型对话页面就够了地址是https://taotoken.net/model-chat。如果你打算长期用 AI 辅助写代码比如让它帮你生成 VB 的数据库操作类那建议开通 Coding Plan地址是https://taotoken.net/coding-plan额度更划算。第三记下 API 端点。所有请求走https://taotoken.net/api注意这个地址不带任何查询参数是干净的 API 根路径。文档在https://taotoken.net/doc里面有完整的请求格式说明。注意API Key 不要硬编码在 VB 源码里然后提交到代码仓库。建议放在配置文件或环境变量中读取避免泄露。配置好之后你就可以在写代码卡壳时随时问模型了。比如ADO 连接 Access 2007 的 accdb 文件连接字符串怎么写模型会直接给你可用的答案。3. 可复制的连接字符串与 RecordCount 代码骨架这一节是核心我把 DAO 和 ADO 两种方式的完整代码都给你直接复制改表名就能用。3.1 ADO 方式客户端游标是关键先看 ADO。记住那个坑必须设置CursorLocation adUseClient否则RecordCount返回 -1。 ADO 方式获取 Access 表记录总数 引用Microsoft ActiveX Data Objects 2.8 Library Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Dim totalCount As Long 连接字符串Access 2007 用 accdb旧版用 mdb Provider 用 Microsoft.ACE.OLEDB.12.0 支持 accdb 如果只有旧版驱动用 Microsoft.Jet.OLEDB.4.0 支持 mdb Dim connStr As String connStr ProviderMicrosoft.ACE.OLEDB.12.0; _ Data SourceC:\data\mydb.accdb; Set conn New ADODB.Connection conn.Open connStr Set rs New ADODB.Recordset 关键一步设置为客户端游标 rs.CursorLocation adUseClient 只取需要的字段不要用 select *减少内存占用 rs.Open SELECT ID FROM 订单表, conn, adOpenStatic, adLockReadOnly 此时 RecordCount 才是真实值 totalCount rs.RecordCount Debug.Print 记录总数 totalCount rs.Close conn.Close Set rs Nothing Set conn Nothing这里有几个细节值得说。adOpenStatic是静态游标配合adUseClient使用最稳。adLockReadOnly表示只读不锁表适合统计场景。查询字段写ID而不是*因为统计总数不需要所有列字段越少客户端缓存越快。如果你要统计的是带条件的记录数比如状态为已完成的订单有多少条把 SQL 改成SELECT ID FROM 订单表 WHERE 状态已完成即可RecordCount会返回符合条件的条数。3.2 DAO 方式老项目的稳妥选择DAO 在 VB6 时代是主流现在维护老系统还会遇到。它的RecordCount不需要设置游标但打开方式有讲究。 DAO 方式获取 Access 表记录总数 引用Microsoft DAO 3.6 Object Library Dim db As DAO.Database Dim rs As DAO.Recordset Dim totalCount As Long 打开数据库 Set db OpenDatabase(C:\data\mydb.mdb) 用快照方式打开RecordCount 直接可用 Set rs db.OpenRecordset(SELECT ID FROM 订单表, dbOpenSnapshot) 如果记录集非空RecordCount 就是总数 If Not rs.EOF Then totalCount rs.RecordCount Else totalCount 0 End If Debug.Print 记录总数 totalCount rs.Close db.Close Set rs Nothing Set db NothingDAO 的dbOpenSnapshot是只读快照性能好RecordCount准确。如果你用dbOpenDynaset也可以但它是可更新的开销略大。统计场景用快照就够了。3.3 两种方式对比对比项ADODAO游标设置必须 adUseClient无需设置支持 accdb是ACE 驱动否仅 mdb性能客户端游标有内存开销快照轻量适用场景新项目、多数据库老项目、纯 AccessRecordCount 可靠性设置正确后可靠直接可靠选哪个如果是新写的 VB.NET 项目用 ADO。如果是维护 VB6 老系统且只连 mdbDAO 更省事。如果老系统要连 accdb那就必须上 ADO 加 ACE 驱动。4. 运行验证与结果核对代码写完了怎么确认RecordCount拿到的值是对的我一般用三步核对。第一步在 Access 里手动打开那张表看左下角状态栏显示的记录数记下来。比如显示记录1/256那总数就是 256。第二步运行上面的 VB 代码把totalCount打印出来。如果和 Access 里看到的一致说明代码正确。第三步做个边界测试。找一张空表运行代码看是否返回 0。再找一张只有 1 条记录的表看是否返回 1。这两个边界能过基本就没问题了。如果你用的是 ADO 且返回 -1先检查CursorLocation那行有没有写、有没有写在Open之前。顺序错了也会失效。如果报未找到提供程序说明 ACE 驱动没装去微软官网下载 Access Database Engine 安装即可。验证通过后你可以把这段逻辑封装成一个函数传入表名返回记录数方便复用Function GetRecordCount(ByVal tableName As String) As Long Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Dim connStr As String connStr ProviderMicrosoft.ACE.OLEDB.12.0; _ Data SourceC:\data\mydb.accdb; Set conn New ADODB.Connection conn.Open connStr Set rs New ADODB.Recordset rs.CursorLocation adUseClient rs.Open SELECT ID FROM tableName, conn, adOpenStatic, adLockReadOnly GetRecordCount rs.RecordCount rs.Close conn.Close Set rs Nothing Set conn Nothing End Function调用时直接Debug.Print GetRecordCount(订单表)就行。5. 本篇常见报错排查这一节把我在实际项目里踩过的坑列出来你遇到问题时可以对照着查。报错一RecordCount 返回 -1。这是最高频的问题。原因就一个游标不是客户端游标。解决方法是确保rs.CursorLocation adUseClient写在rs.Open之前。如果你用的是 DAO检查是不是用了dbOpenForwardOnly这种只进游标也会返回 -1换成dbOpenSnapshot。报错二未找到提供程序可能未正确安装。这是 ACE 驱动缺失。Access 2007 之后的 accdb 格式需要Microsoft.ACE.OLEDB.12.0驱动系统默认不带。去微软下载页搜Access Database Engine安装。注意 32 位和 64 位要和你 VB 程序的位数匹配不匹配会报同样的错。报错三找不到可安装的 ISAM。通常是连接字符串拼错了比如Data Source写成了DataSource或者路径里有中文没加引号。检查连接字符串的每个分号分隔项路径用双引号包起来。报错四记录集为空时 RecordCount 为 0 但代码报错。如果表里没数据rs.EOF为 True直接读RecordCount在某些驱动下会异常。加个判断If Not rs.EOF Then totalCount rs.RecordCount Else totalCount 0。报错五多用户环境下记录数不准。客户端游标是把数据拉到本地缓存的如果在你读取的瞬间别人往表里插了数据你拿到的还是旧值。统计场景一般能接受如果要求实时精确改用SELECT COUNT(*)查询让数据库自己算。说到SELECT COUNT(*)其实这是另一种获取总数的思路不依赖RecordCountDim rs As ADODB.Recordset Set rs conn.Execute(SELECT COUNT(*) AS cnt FROM 订单表) totalCount rs.Fields(cnt).Value这种方式不需要设置游标也不受游标类型影响缺点是每次都要执行一次聚合查询。数据量小的时候两种方式差别不大数据量大时COUNT(*)反而更快因为它不用把数据拉到本地。排查时如果拿不准可以把你的连接字符串和报错信息丢给模型让它帮你分析。TaoToken 的模型对话入口在https://taotoken.net/model-chat直接粘贴代码和报错就行。6. 把 AI 辅助接入你的 VB 开发流数据库代码写多了会发现连接字符串、SQL 语法、游标参数这些东西翻来覆去就那几套但每次记不全。我现在习惯把常用的代码骨架存在本地遇到新表新库时让模型帮我改改表名和字段名比从头写快。如果你也想把 AI 辅助固定到开发流程里建议走 Coding Plan地址是https://taotoken.net/coding-plan。它适合长期写代码的场景额度比按次调用划算。接入时用统一的 API Key端点走https://taotoken.net/api具体请求格式看文档https://taotoken.net/doc。配置好之后你可以在 VB 的注释里直接写需求比如生成一个函数传入表名返回记录数用 ADO 客户端游标然后把生成的代码粘进去微调。实测下来这种用法比手动查文档效率高不少尤其是处理不熟悉的 Access 版本和驱动组合时。最后提醒一句AI 生成的代码一定要自己跑一遍验证特别是连接字符串里的路径和驱动版本这些和你的实际环境强相关模型给的是通用模板落地时得按自己的机器改。
企业数字化 ERP 产品动态
相关推荐
Expect MCP服务器配置指南:8大浏览器测试工具接入Claude Code、Cursor和Codex Expect MCP服务器配置指南:8大浏览器测试工具接入Claude Code、Cursor和Codex 【免费下载链接】expect Expect tests your agents code in a real browser 项目地址: https://gitcode.com/gh_mirrors/expect6/expect
Expect 是一款让 AI 编程助手在真实浏览器… · 2026/9/26 10:35:32
PyTorch 导出 ONNX 时如何不固定输入输出维度:TaoToken 配置骨架与验证动作 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 10:35:32
Qt与Tesseract Windows 64位编译集成全攻略 简介:这是适用于 Qt 的 Tesseract OCR 引擎 Windows 64 位预编译版本,面向需要在 Windows 下为 Qt 应用集成文字识别能力的开发者,可省去繁琐的依赖配置与源码编译过程,直接获得可用环境。压缩包内含 916 个文件,大小约… · 2026/9/26 11:41:29
Go项目部署宝塔面板:从交叉编译到反向代理全指南 最近刚把一个 Go 项目完整部署到宝塔面板上,数据库用的 MySQL,前后折腾了两天。从交叉编译到进程守护、从反向代理到数据库授权,每一步都有不少容易踩的坑。这篇文档我尽量写全,记录整个部署思路和实操过程,目标是让没… · 2026/9/26 11:41:29
SCAU计算机网络期末复习:CRC校验与TCP拥塞控制核心要点 说出来你可能不信,我考《计算机网络》那会儿,最痛苦的并不是记不住OSI七层,而是明明背了一堆协议,看到卷子上“CRC校验怎么算”和“TCP拥塞窗口怎么画”的时候,依然脑子一片空白。后来把书翻烂、把王道和谢希仁结合着来… · 2026/9/26 11:41:29
计算机网络期末冲刺:核心考点、计算题与实验报告清单 期末周又来了,又有人在图书馆抱着谢希仁的《计算机网络》犯愁。这门课在我校基本是计算机相关专业的必修课,范围广、概念多、协议杂,最烦的是你以为背熟了“三次握手”,结果大题考你“从Wireshark报文里分析TCP重传”。我当年也在… · 2026/9/26 11:41:29
settings.gradle从入门到实战:多模块与仓库配置排查指南 在一台新电脑上克隆下一个安卓工程,配置好JDK和Android SDK,满怀信心地点开Android Studio的Sync,结果Gradle一顿报错,十有八九问题不在build.gradle,而在根目录那个不起眼的setting.gradle。这个文件平时存在感极低&a… · 2026/9/26 11:41:29
Tinder研究工具:从抓包到滑动自动化,破解推荐机制与匹配数据 简介:Tinder-1.2.2 是一份面向 Java 开发者与算法学习者的开源工具源码包,聚焦数据匹配、推荐系统或算法优化场景,可帮助读者理解工具内核与实现原理。资源共53个文件,其中 Java 源文件达50个,覆盖核心逻辑与测试用例&… · 2026/9/26 11:41:23
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46