尧图精选

VB 中 Recordset 的用法:把连接串改到 TaoToken 后如何排查 401 与 local proxy failed

🕒 发布时间:2026/10/2 12:16:11 📁 来源:尧图网络
1. VB 里 Recordset 到底在做什么从连接串到游标的一次完整拆解VB6 和 VBA 里操作数据库绕不开 ADO 的 Recordset。很多人第一次写Rs.Open Source, ActiveConnection, CursorType, LockType, Options时只是照着示例把参数填进去能跑就行。可一旦把连接配置改到统一 API 通道比如把原来直连数据库的连接串换成 TaoToken 的 Key 和 Base URL报错就会集中爆发401、local proxy failed、reading choices之类看着像网络问题实际是认证和请求格式没对齐。Recordset 的本质是一个游标容器。它不负责“连数据库”这件事本身连接由 Connection 对象或连接串完成Recordset 只负责把结果集装进来并提供 MoveFirst、MoveNext、Fields、RecordCount 这些遍历和读取手段。所以当你把连接串改到 TaoToken 后Recordset 的打开参数里真正需要动的是 ActiveConnection 和 OptionsCursorType 与 LockType 保持默认通常就够。适合读这篇的人有三类一是维护老 VB6 项目、需要把数据访问层统一到 API 通道的开发者二是写 VBA 宏、想用 Recordset 拉取模型返回结构化数据的办公自动化同学三是刚接触 ADO、被 401 和 local proxy failed 卡住、不知道从哪查起的新手。下面我会先讲清楚 Recordset 各参数的含义再给出可复制的连接串和打开参数最后用最小查询一步步验证连通性把认证失败定位到具体环节。需要先明确一点TaoToken 在这里扮演的是统一 Key 和 API 入口的角色你的 VB 代码通过 HTTP 请求访问它而不是直连某个数据库。Recordset 能不能用取决于你用的 ADO 提供程序是否支持 HTTP 端点。多数情况下VB 里访问 API 通道会用 MSXML2.ServerXMLHTTP 或 WinHTTP 发请求再把返回的 JSON 解析后塞进 Recordset 或数组。如果你硬把 HTTP 地址当 ODBC 连接串塞给 ADO就会直接报 local proxy failed。这一点是后面排障的核心。2. 把连接配置迁到 TaoToken 前先搞懂 Recordset 打开参数与认证链路在动手改连接串之前得先把 Recordset 的五个参数和 TaoToken 的认证链路对应起来。Rs.Open Source, ActiveConnection, CursorType, LockType, Options里Source 是 SQL 或表名ActiveConnection 是连接对象或连接串CursorType 决定游标类型LockType 决定锁定方式Options 告诉提供程序怎么解释 Source。改到 TaoToken 后Source 和 Options 基本不变变的是 ActiveConnection 指向的端点以及请求头里要带的 Key。TaoToken 的接入信息有三个关键件Base URL、API Key、Model ID。Base URL 用https://taotoken.net/apiAPI Key 在控制台的 API Keys 页面生成Model ID 按你实际调用的模型填。这三件套在 VB 里不是塞进 ADO 连接串而是塞进 HTTP 请求。你可以先到https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentrecordset_vbutm_campaignrewrite拿到 Key再对照https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentrecordset_vbutm_campaignrewrite确认请求格式。为什么很多人改完就 401因为 ADO 的连接串语法和 HTTP 请求头是两套东西。ADO 连接串长这样ProviderMSDASQL;Driver{SQL Server};Server...;UID...;PWD...。而 TaoToken 要的是Authorization: Bearer 你的Key这样的请求头。你把 Key 写进 ADO 连接串的 PWD 字段ADO 会把它当数据库密码发给一个根本不存在的数据库驱动结果要么连不上要么返回 401。正确做法是VB 里用 ServerXMLHTTP 发 POST 请求到https://taotoken.net/api请求头带 Authorization请求体带 model 和 messages拿到 JSON 后再解析。CursorType 和 LockType 在这里的作用要重新理解。如果你是把 API 返回的 JSON 解析后手动填充 Recordset那 CursorType 用 adOpenStatic 或 adOpenForwardOnly 都行LockType 用 adLockReadOnly因为数据是只读的。如果你还在用 ADO 直连某个支持 HTTP 的提供程序那 CursorType 必须选提供程序支持的类型否则会报“提供程序不支持该游标类型”。实测下来统一用 adOpenStatic adLockReadOnly 最稳兼容性最好。Options 参数容易被忽略。当你用adCmdText时提供程序会把 Source 当 SQL 文本执行用adCmdTable时它会生成一条 SELECT * 查询。在 API 通道场景下Source 往往不是 SQL而是一段 JSON 或一个模型调用指令这时候 Options 要设成adCmdText并确保提供程序能理解。如果你用的是自定义的 HTTP 封装Options 其实不参与因为请求是你自己发的。所以排障时要先确认你到底走的是 ADO 直连还是 HTTP 封装。这两条路的报错含义完全不同。3. 可复制的连接串与 Recordset 打开参数配置这一节给出两套配置一套是 VB6/VBA 里用 ServerXMLHTTP 访问 TaoToken 的完整代码另一套是如果你坚持用 ADO Recordset 装结果集时的打开参数。两套配合使用先拿数据再装进 Recordset。先看 HTTP 请求部分。新建一个标准模块粘贴以下代码。注意把YOUR_API_KEY换成你在控制台生成的 KeyModel ID 按实际填。Option Explicit Public Function CallTaoToken(ByVal userPrompt As String) As String Dim http As Object Dim url As String Dim payload As String Dim apiKey As String apiKey YOUR_API_KEY url https://taotoken.net/api payload {model:YOUR_MODEL_ID,messages:[{role:user,content: userPrompt }]} Set http CreateObject(MSXML2.ServerXMLHTTP.6.0) http.Open POST, url, False http.setRequestHeader Content-Type, application/json http.setRequestHeader Authorization, Bearer apiKey http.send payload If http.Status 200 Then CallTaoToken http.responseText Else CallTaoToken HTTP http.Status : http.responseText End If Set http Nothing End Function这段代码里http.Status是判断认证是否通过的关键。401 会在这里返回responseText里通常带invalid api key或unauthorized。local proxy failed 一般不会出现在这里它更多出现在你用了系统代理或 ADO 直连 HTTP 端点时。再看 Recordset 部分。假设你已经拿到 JSON想把它转成 Recordset 方便遍历可以用 ADO 的断开式记录集手动构造字段。下面这段把两个字段塞进 RecordsetPublic Function BuildRecordset() As ADODB.Recordset Dim rs As ADODB.Recordset Set rs New ADODB.Recordset rs.Fields.Append id, adInteger rs.Fields.Append content, adVarChar, 4000 rs.Open rs.AddNew rs(id) 1 rs(content) TaoToken 返回的文本 rs.Update Set BuildRecordset rs End Function如果你是用 ADO 直连某个数据库连接串要写成这样但注意这不是 TaoToken 的用法TaoToken 不走 ADO 连接串Dim connStr As String connStr ProviderMSDASQL;Driver{MySQL ODBC 8.0 Driver};Serverlocalhost;Databasetest;UIDroot;PWD123456;把 Key 写进 ADO 连接串是常见错误。TaoToken 的 Key 只放在 HTTP 请求头里。如果你在 VB 里看到 local proxy failed先检查是不是系统里配了代理或者代码里误用了WinHttp.WinHttpRequest并设置了代理。ServerXMLHTTP 默认走系统代理设置可以在请求前加一行http.setProxy 2, 来绕过但更推荐直接检查系统代理配置。CursorType 和 LockType 的推荐组合参数推荐值说明CursorTypeadOpenStatic静态游标支持前后移动适合只读数据LockTypeadLockReadOnly只读锁定避免并发写冲突OptionsadCmdText把 Source 当文本指令处理这套组合在 API 返回数据装进 Recordset 的场景下最稳。如果你需要分页再设 PageSize 和 AbsolutePage。4. 用最小查询验证连通性从发请求到 Recordset 遍历配置写好后不要一上来就跑完整业务。先用最小查询验证链路发一条最简单的请求看返回状态码和内容再把它装进 Recordset 遍历。这样能把问题范围缩到最小。第一步在 VBA 的立即窗口里直接调用CallTaoToken(hello)看返回什么。如果返回HTTP 401说明 Key 不对或请求头没带上。如果返回HTTP 200但内容为空说明 Model ID 可能不对。如果直接报错“自动化错误”检查 MSXML2.ServerXMLHTTP.6.0 是否注册32 位和 64 位 Office 的组件版本不一样。第二步把返回的 JSON 用字符串函数截取关键字段或者引入 JSON 解析库。VB6 没有内置 JSON 解析可以用ScriptControl或手写简单解析。下面是一个手写截取的例子只取 content 字段Dim resp As String Dim pos As Long resp CallTaoToken(hello) pos InStr(resp, content:) If pos 0 Then Dim startPos As Long startPos pos Len(content:) Dim endPos As Long endPos InStr(startPos, resp, ) Debug.Print Mid(resp, startPos, endPos - startPos) End If第三步把取到的文本塞进 Recordset 并遍历。用第 3 节的 BuildRecordset 函数然后Dim rs As ADODB.Recordset Set rs BuildRecordset() rs.MoveFirst Do While Not rs.EOF Debug.Print rs(id), rs(content) rs.MoveNext Loop rs.Close Set rs Nothing如果这一步能打印出内容说明整条链路通了。如果 Recordset 打开时报“未找到提供程序”检查是否引用了 Microsoft ActiveX Data Objects 2.8 Library。在 VBA 里点工具-引用勾选对应版本。验证成功的标志有三个HTTP 状态码 200、返回 JSON 里有 content 字段、Recordset 能正常 MoveNext 并读到值。任何一个不满足就回到对应环节排查。401 查 Key 和请求头local proxy failed 查代理和端点reading choices查请求体格式和 Model ID。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth这一节把四个高频报错逐个拆开给出对照表和修复动作。这些报错在 VB 接入 TaoToken 时反复出现按顺序查基本能定位。401 Unauthorized。最常见的原因是 Key 没带、带错、或者带了多余空格。检查http.setRequestHeader Authorization, Bearer apiKey这一行确认 apiKey 变量里没有换行符。如果你是从网页复制 Key末尾可能带空格。另外Key 如果被撤销或过期也会 401去控制台重新生成一个。注意不要用 OAuth 的 token 去调 API Key 接口两者不是一套。local proxy failed。这个报错通常出现在 ADO 直连 HTTP 端点或者系统代理配置异常时。TaoToken 的 Base URL 是https://taotoken.net/api不是数据库连接串。如果你在 ADO 连接串里写了这个地址ADO 会尝试用本地代理去连然后失败。修复方法是改用 ServerXMLHTTP 发请求不要用 ADO 直连。另外检查 IE 代理设置ServerXMLHTTP 默认继承系统代理可以在代码里加http.setProxy 2, 临时绕过。reading choices。这个报错说明返回的 JSON 结构里没有 choices 字段通常是请求体格式不对。检查 payload 里的 model 和 messages 字段名是否正确JSON 引号是否转义。VB 里拼 JSON 容易漏引号建议用双引号转义或引入 JSON 库。另外确认 Model ID 是 TaoToken 支持的模型填错模型名会返回错误结构。OAuth 相关报错。如果你在代码里用了 OAuth 流程去换 token但调的是 API Key 接口会报认证方式不匹配。TaoToken 的 API 调用用 Bearer Key不需要 OAuth。把 OAuth 相关代码去掉直接用 API Key。对照表报错可能原因修复动作401Key 缺失/错误/过期重新生成 Key检查请求头local proxy failedADO 直连 HTTP 或系统代理异常改用 ServerXMLHTTP检查代理reading choices请求体格式错或 Model ID 错检查 JSON 和模型名OAuth 错误认证方式混用改用 Bearer Key排查顺序建议先看 HTTP 状态码再看返回体最后看 Recordset 打开参数。状态码 401 直接查 Key状态码 200 但内容异常查请求体Recordset 报错查引用和游标类型。6. 把 Recordset 接入 TaoToken 的长期用法与 CTARecordset 在 VB 里是个老而稳的容器把它和 TaoToken 结合关键是把“取数据”和“装数据”分开。取数据用 HTTP 请求装数据用 Recordset 手动构造字段。这样既保留了 Recordset 的遍历便利又避开了 ADO 直连 HTTP 的坑。长期用的话建议把 CallTaoToken 封装成一个类模块把 Key 和 Base URL 放在配置里不要硬编码。Model ID 也做成可切换的方便对比不同模型返回。Recordset 的字段定义按实际返回结构来content 字段长度给足避免截断。如果你要跑长期编码任务或 Agent 场景可以了解 Coding Plan把调用额度集中管理。需要验证模型返回效果直接到模型对话页面试。排障和接入细节对照接入文档和 API Keys 页面操作。模型对话https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentrecordset_vbutm_campaignrewriteCoding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentrecordset_vbutm_campaignrewrite控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentrecordset_vbutm_campaignrewriteAPI Keyshttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentrecordset_vbutm_campaignrewrite接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentrecordset_vbutm_campaignrewrite最后留一个实用技巧在 VB 里调试 HTTP 请求时把http.responseText完整打印到立即窗口不要只看状态码。很多 401 和格式错误的信息都在返回体里看一眼就能定位。Recordset 那边打开前先确认引用和游标类型能省掉一半的“提供程序不支持”报错。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →