ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

VBA ADO RecordCount=-1 排查指南:TaoToken 统一 Key 通道下的连接配置与验证

VBA ADO RecordCount=-1 排查指南:TaoToken 统一 Key 通道下的连接配置与验证 1. 为什么你的 VBA 里 RecordCount 总是 -1如果你在用 VBA 写 Excel 宏或者 Access 自动化通过 ADO 连数据库查数据然后想用rs.RecordCount拿总行数来做进度条、分页或者判断空结果结果发现它永远返回 -1这不是你的代码写错了而是 ADO 的默认行为在作怪。RecordCount 返回 -1 的本质原因是Recordset 打开时使用的游标类型不支持向后滚动或无法确定记录总数。ADO 默认使用的是仅向前游标adOpenForwardOnly这种游标为了性能只允许从前往后读根本不维护总行数所以 RecordCount 只能返回 -1。很多教程只告诉你改成rs.Open Sql, cnn, 1, 3就完事了但没解释为什么也没告诉你连接字符串、Provider 选择、甚至网络通道配置都会影响这个行为。这篇文章面向的是已经会写基本 VBA、能连上数据库但被 RecordCount 卡住的开发者。我会从游标类型和连接字符串两个角度把原因讲透给出可直接复制的 ADO 连接配置骨架同时结合 TaoToken 统一 Key 通道的 settings.json 配置示例让你在需要调用外部模型或 API 做数据处理时也能有一套稳定的接入方式。最后附上 RecordCount 的验证动作和预期结果帮你快速复现并确认修复。2. TaoToken 前置统一 Key 通道解决什么在讲 ADO 配置之前先说一下 TaoToken 在这个场景里的位置。很多 VBA 项目不只是查本地数据库还会调用外部 API 做数据清洗、文本分析或者模型推理。如果每个功能都单独申请 Key、单独配环境变量维护起来很痛苦。TaoToken 提供的是一个统一 Key 通道你只需要在 settings.json 里配一次后续模型对话、编码辅助、API 调用都走同一个入口。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。注意 API 地址不带 UTM 参数直接访问即可。如果你只是想在 VBA 里做数据库查询TaoToken 不是必须的但如果你需要把查询结果送给模型做进一步处理或者用 Coding Plan 来辅助生成 VBA 代码那统一 Key 通道会省掉很多重复配置的麻烦。我试过在多个 VBA 项目里混用不同的 Key结果就是配置文件散落各处换一台机器就要重新找一遍。后来统一走 TaoToken 的 settings.json至少 Key 管理这一块清爽了很多。下面第三节会给出具体的配置骨架。3. 可复制配置ADO 连接骨架与 settings.json3.1 ADO 连接字符串与游标参数先解决 RecordCount 的核心问题。下面这段 VBA 代码是一个完整的连接骨架你可以直接复制到模块里把连接字符串换成你自己的数据库路径或服务器地址。Sub QueryWithRecordCount() Dim cnn As ADODB.Connection Dim rs As ADODB.Recordset Dim sql As String Set cnn New ADODB.Connection Set rs New ADODB.Recordset 连接字符串Access 示例 cnn.ConnectionString ProviderMicrosoft.ACE.OLEDB.12.0; _ Data SourceC:\data\demo.accdb; cnn.Open sql SELECT ID, Name, Amount FROM Orders WHERE Amount 100 关键CursorType1键集游标LockType3乐观锁定 rs.Open sql, cnn, 1, 3 此时 RecordCount 返回真实行数 Debug.Print 总行数 rs.RecordCount Do While Not rs.EOF Debug.Print rs.Fields(Name).Value rs.MoveNext Loop rs.Close cnn.Close Set rs Nothing Set cnn Nothing End Subrs.Open Source, ActiveConnection, CursorType, LockType, Options这四个参数里第三个 CursorType 决定了 RecordCount 能不能用。取值对照如下CursorType名称是否支持 RecordCount适用场景0adOpenForwardOnly否返回 -1只读遍历性能最好1adOpenKeyset是需要行数、分页、书签2adOpenDynamic是多用户实时增删改3adOpenStatic是数据快照只读分析LockType 的取值也顺带列一下方便你按需组合LockType含义说明1adLockReadOnly只读默认值2adLockPessimistic编辑时立即锁定3adLockOptimistic调用 Update 时才锁定4adLockBatchOptimistic批处理更新如果你只是要读数据并拿行数rs.Open sql, cnn, 1, 1就够了用只读锁定减少资源占用。如果你后续还要改数据再用1, 3。3.2 TaoToken settings.json 配置示例当你的 VBA 流程需要调用外部模型或 API 时可以在项目目录下放一个 settings.json统一走 TaoToken 的 Key 通道。下面是一个配置骨架{ provider: taotoken, api_base: https://taotoken.net/api, api_key: 你的统一Key, models: { chat: gpt-4o-mini, coding: claude-3-5-sonnet }, timeout: 30, retry: 2 }VBA 里读取这个配置可以用简单的文件读取加字符串解析或者用ScriptControl解析 JSON。如果你不想在 VBA 里手写 JSON 解析也可以把 Key 放在环境变量里VBA 通过Environ(TAOTOKEN_KEY)读取。这样配置文件里就不用写明文 Key安全性更好。需要生成或管理 Key 的话可以走 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有各语言的调用示例VBA 用 WinHTTP 或 MSXML2.XMLHTTP 都能对接。4. 验证请求与成功结果配置改完之后怎么确认 RecordCount 真的修好了不要只看代码要跑一个最小验证。第一步在 VBA 里打开立即窗口CtrlG运行上面那段QueryWithRecordCount。如果 Debug.Print 输出的总行数是一个大于等于 0 的整数而不是 -1说明游标类型生效了。第二步做一个对照实验。把rs.Open sql, cnn, 1, 3改成rs.Open sql, cnn, 0, 1再跑一次。你应该会看到 RecordCount 变回 -1。这个对照能帮你确认问题确实出在游标类型上而不是连接字符串或者 SQL 本身。第三步如果你同时配了 TaoToken 的 settings.json可以写一个简单的 HTTP 请求验证 Key 通道是否通Function TestTaoToken() As String Dim http As Object Set http CreateObject(MSXML2.XMLHTTP) Dim url As String url https://taotoken.net/api/chat/completions Dim body As String body {model:gpt-4o-mini,messages:[{role:user,content:ping}]} http.Open POST, url, False http.setRequestHeader Content-Type, application/json http.setRequestHeader Authorization, Bearer Environ(TAOTOKEN_KEY) http.send body TestTaoToken http.responseText End Function预期结果是返回一段 JSON包含模型回复内容。如果返回 401说明 Key 没配好如果超时检查网络和 api_base 是否正确。模型对话的入口在 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 你可以先在网页上确认 Key 能用再回到 VBA 里调。5. 本篇常见错排查5.1 RecordCount 还是 -1最常见的原因是游标类型没改对。检查rs.Open的第三个参数是不是 1 或 3。另外如果你用的是adOpenForwardOnly但数据量很小有些 Provider 会“聪明”地返回真实行数这属于偶然现象不要依赖。还有一种情况是 Recordset 已经关闭或者没有正确 Set导致对象状态异常。5.2 连接字符串报错“未找到提供程序”Access 数据库用Microsoft.ACE.OLEDB.12.0SQL Server 用SQLOLEDB或MSOLEDBSQL。如果你在 64 位 Office 里跑 32 位 Provider或者反过来就会报这个错。解决办法是确认 Office 位数和 Provider 位数一致或者换用 ODBC 驱动。5.3 TaoToken 请求返回 403 或 401先检查 Authorization 头里的 Bearer 后面有没有多余空格。然后确认 Key 没有过期可以在 API Keys 页面重新生成一个。如果还是不行检查 settings.json 里的 api_base 是不是写成了带 UTM 的地址API 调用应该用 https://taotoken.net/api 不要加查询参数。5.4 VBA 里 JSON 解析乱码VBA 原生不支持 JSON用 ScriptControl 解析时注意设置编码。如果返回的中文乱码可以在 http 请求后把 responseBody 转成字符串时指定 UTF-8。简单做法是用ADODB.Stream读取二进制再转文本。5.5 长时间运行后 RecordCount 变慢键集游标和静态游标都会在内存里维护记录集数据量特别大时比如几十万行会吃内存。如果只是要行数可以考虑用SELECT COUNT(*)单独查一次然后用仅向前游标遍历数据。这样 RecordCount 的问题绕开了性能也更好。6. 接入与排障入口如果你在配置 ADO 连接或者 TaoToken Key 通道时遇到问题可以直接走下面这些入口。排障和接入相关的优先看 API Keys 和接入文档想先验证模型能不能通去模型对话页面如果是长期编码或者 Agent 场景Coding Plan 更合适。API Keys 管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite模型对话验证https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewriteCoding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewriteClaude Code Anthropic 接入https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaude_codeutm_campaignrewrite最后说一个我踩过的坑改完游标类型后记得把rs.Close和cnn.Close都写上并且把对象 Set 成 Nothing。VBA 不会自动回收这些 COM 对象长时间跑宏不释放下一次打开 Recordset 可能会拿到脏状态RecordCount 又变成 -1。这个细节很少有人提但确实会影响复现结果。
返回列表