新闻详情

新闻详情

首页 / 资讯中心 / 详情

Delphi数据库编程新手指南(10):用ADO Recordset游标逐行处理数据的配置与验证

发布时间:2026/10/2 16:28:45来源:尧图网络
Delphi数据库编程新手指南(10):用ADO Recordset游标逐行处理数据的配置与验证
1. Delphi 里 ADO 游标到底在解决什么问题如果你刚开始用 Delphi 连数据库大概率会遇到这样一个场景TADOQuery的SELECT语句已经写好了Open之后界面上也能看到数据但你想在代码里一行一行地读出来做处理比如把每条记录的某个字段拼成字符串、逐行校验数据、或者根据某列的值决定要不要跳过这一行。这时候你会发现光靠数据感知组件TDBGrid那一套是不够的你需要直接操作 ADO 的 Recordset 游标。Recordset 是什么你可以把它理解成“查询命令执行完之后数据库返回给你的那张临时结果表”。这张表里不仅有数据本身还记录了“当前读到哪一行了”“能不能往回滚”“别人改了数据我这边看不看得到”这些状态信息。游标Cursor就是用来维护这些状态的机制。没有游标你拿到的就只是一堆静态数据没法知道当前位置也没法控制遍历方式。在 Delphi 的 ADOExpress 组件体系里TADOConnection负责建立连接TADOQuery、TADOTable、TADODataSet这些组件都继承自TCustomADODataSet它们共享一组和游标相关的属性CursorType、CursorLocation、LockType。这三个属性决定了你的 Recordset 打开之后是什么行为。很多新手写代码时只改SQL和Connection其他全用默认值结果遇到RecordCount返回 -1、EOF判断失效、或者遍历到一半报错的情况根源往往就在这里。这篇内容面向的是刚接触 Delphi 数据库编程、想搞清楚 ADO 游标逐行遍历怎么配置和验证的读者。我会从连接配置开始给出可以直接复制的组件设置和代码骨架然后一步步验证遍历结果最后把常见的报错和排查思路整理出来。你不需要事先了解 OLE DB 的底层细节跟着操作就能在 IDE 里跑通。核心检索词先明确一下Delphi ADO Recordset 游标逐行遍历、CursorType 设置、EOF 判断、字段取值。这几个词贯穿全文你在搜索相关资料时也可以围绕它们展开。实际开发中逐行处理数据的场景比想象中多。比如从 Access 数据库里导出数据到文本文件、把一批订单记录逐条推送到消息队列、或者对查询结果做二次计算后再写回另一张表。这些操作都要求你能稳定地控制游标位置正确判断是否读到了末尾并且知道当前行的字段值怎么取。下面就从环境准备开始一步步搭起来。2. 前置准备TaoToken 接入与 ADO 组件配置骨架在开始写游标遍历代码之前先把两件事准备好一是数据库连接本身二是如果你后续想用大模型辅助生成 SQL 或排查报错可以先把 TaoToken 的接入配置做好。TaoToken 是一个大模型 API 聚合平台兼容 OpenAI 风格的接口对于 Delphi 开发者来说它的价值在于可以用统一的 Base URL 和 Key 来调用多种模型辅助你写 SQL、解释报错信息、生成测试数据。先看 TaoToken 的接入配置。你需要拿到三个东西Base URL、API Key、Model ID。Base URL 是https://taotoken.net/apiAPI Key 在控制台的 API Keys 页面创建Model ID 根据你选的模型填写。如果你用的是 Claude Code 或者类似的编码工具配置方式略有不同但核心三件套不变。对于 Delphi 项目本身ADO 组件的配置才是重点。在窗体上放一个TADOConnection、一个TADOQuery然后按下面的方式设置属性。TADOConnection的关键属性属性建议值说明ConnectionStringProviderMicrosoft.Jet.OLEDB.4.0;Data Source你的.mdb路径Access 2003 及以前用 Jet2007 以后用 ACELoginPromptFalse避免每次弹登录框ConnectedTrue设计期可先设为 True 测试TADOQuery的关键属性属性建议值说明Connection指向上面的TADOConnection必须设置CursorTypectStatic或ctForwardOnly逐行遍历常用这两种CursorLocationclUseClient客户端游标滚动更快LockTypeltReadOnly只读遍历时用这个SQLSELECT * FROM 表名你的查询语句这里重点说一下CursorType的选择。如果你只是从头到尾读一遍不打算往回滚用ctForwardOnly性能最好。但要注意ctForwardOnly不支持RecordCount你调RecordCount会返回 -1。如果你需要知道总行数或者要来回滚动就用ctStatic。ctStatic是静态副本打开之后其他用户对数据库的修改你看不到适合做报表或者数据导出。CursorLocation设为clUseClient时ADO 会把查询结果全部拉到客户端内存里之后你的遍历操作都在本地进行速度很快。但数据量特别大的时候要小心内存占用。如果结果集很大可以考虑clUseServer但那样每次滚动都会向服务器发请求网络开销更大。LockType在只读遍历场景下设为ltReadOnly就行。如果你遍历过程中要修改记录再考虑ltOptimistic。ltBatchOptimistic用于断开连接的批量更新新手阶段可以先不碰。配置好之后在代码里打开数据集procedure TForm1.OpenDataSet; begin ADOQuery1.Close; ADOQuery1.SQL.Text : SELECT * FROM Customers; ADOQuery1.CursorType : ctStatic; ADOQuery1.CursorLocation : clUseClient; ADOQuery1.LockType : ltReadOnly; ADOQuery1.Open; end;这段代码可以直接复制到你的单元里把表名换成你自己的。注意Close再Open的顺序避免重复打开导致状态混乱。如果你在配置 TaoToken 时遇到问题比如不确定 Model ID 填什么可以去模型对话页面直接试一下确认能正常返回再写进配置。API Keys 页面可以创建和查看你的 Key接入文档里有完整的参数说明。对于长期做 Delphi 开发、需要频繁用模型辅助写 SQL 的场景Coding Plan 会更划算一些。3. 可复制的游标遍历配置与逐行读取代码这一节给出完整的、可以直接粘贴到 Delphi 单元里的代码。我会把连接配置、游标设置、逐行遍历、字段取值都串起来你照着改表名和字段名就能跑。先看完整的单元结构。假设你的窗体上已经有ADOConnection1和ADOQuery1并且ADOConnection1的ConnectionString已经指向了一个 Access 数据库。unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Data.Win.ADODB, Vcl.Grids, Vcl.DBGrids, Data.DB; type TForm1 class(TForm) ADOConnection1: TADOConnection; ADOQuery1: TADOQuery; Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private procedure SetupCursor; procedure IterateRows; public end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.SetupCursor; begin ADOQuery1.Close; ADOQuery1.Connection : ADOConnection1; ADOQuery1.CursorType : ctStatic; ADOQuery1.CursorLocation : clUseClient; ADOQuery1.LockType : ltReadOnly; ADOQuery1.SQL.Text : SELECT CustomerID, CompanyName, ContactName FROM Customers; end; procedure TForm1.IterateRows; var RowCount: Integer; Line: string; begin RowCount : 0; ADOQuery1.First; while not ADOQuery1.Eof do begin Inc(RowCount); Line : Format(第 %d 行 | ID%s | 公司%s | 联系人%s, [RowCount, ADOQuery1.FieldByName(CustomerID).AsString, ADOQuery1.FieldByName(CompanyName).AsString, ADOQuery1.FieldByName(ContactName).AsString]); Memo1.Lines.Add(Line); ADOQuery1.Next; end; Memo1.Lines.Add(--- 共读取 IntToStr(RowCount) 行 ---); end; procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Clear; SetupCursor; ADOQuery1.Open; if ADOQuery1.IsEmpty then begin Memo1.Lines.Add(查询结果为空没有可遍历的行。); Exit; end; IterateRows; ADOQuery1.Close; end; end.这段代码里有几个关键点需要展开说明。ADOQuery1.First把游标移到第一行。如果你用的是ctForwardOnlyFirst方法可能不被支持会抛异常。所以如果你确定只用ctForwardOnly遍历前不要调First直接判断Eof然后Next就行。但ctStatic和ctKeyset都支持First。while not ADOQuery1.Eof do是逐行遍历的标准写法。Eof为True表示游标已经越过了最后一行。每次循环体执行完必须调Next否则会死循环。这个坑很常见新手容易忘记写Next然后程序卡死。字段取值用FieldByName(字段名).AsString或者.AsInteger、.AsFloat、.AsDateTime。FieldByName每次都会按名称查找字段如果循环次数很多可以提前用FieldByName拿到TField引用循环里直接用引用性能会好一些var FldID, FldName: TField; begin FldID : ADOQuery1.FieldByName(CustomerID); FldName : ADOQuery1.FieldByName(CompanyName); ADOQuery1.First; while not ADOQuery1.Eof do begin // 直接用 FldID.AsString、FldName.AsString ADOQuery1.Next; end; end;IsEmpty属性用来判断结果集是否为空。如果查询没有返回任何行Eof一开始就是True直接进while循环也不会执行但加一个IsEmpty判断可以让逻辑更清晰也方便给用户提示。关于RecordCount在ctStaticclUseClient的组合下Open之后RecordCount会返回实际行数。你可以用这个值来初始化进度条或者预分配数组。但在ctForwardOnly下RecordCount返回 -1不要依赖它。如果你需要遍历过程中修改数据把LockType改成ltOptimistic然后在循环里用Edit/PostADOQuery1.Edit; ADOQuery1.FieldByName(ContactName).AsString : 新联系人; ADOQuery1.Post;但注意ctStatic游标下修改数据其他用户看不到你的更改直到你Post之后 ADO 把更改提交到数据库。如果多人同时操作要考虑冲突处理。配置 TaoToken 的 JSON 片段可以参考下面这个结构用于在支持配置文件的地方填入{ base_url: https://taotoken.net/api, api_key: 你的API Key, model_id: 你选择的模型ID }这个配置不是 Delphi 项目本身需要的而是当你用外部工具辅助开发时用的。Delphi 的 ADO 配置还是以组件属性为准。4. 验证请求与成功结果在 IDE 里跑通遍历流程代码写完之后怎么确认它真的在工作这一节给出具体的验证步骤和预期结果。第一步在设计期确认连接可用。选中ADOConnection1把Connected设为True。如果ConnectionString正确Object Inspector 里不会报错。如果弹出登录框检查LoginPrompt是否设为False。如果报“找不到可安装的 ISAM”或者“未找到提供程序”说明 Provider 字符串写错了Access 2007 以后的.accdb文件要用Microsoft.ACE.OLEDB.12.0并且需要安装对应的数据库引擎。第二步在代码里调用SetupCursor之后先不遍历只Open然后检查几个属性ADOQuery1.Open; ShowMessage(RecordCount IntToStr(ADOQuery1.RecordCount)); ShowMessage(Eof BoolToStr(ADOQuery1.Eof, True)); ShowMessage(FieldCount IntToStr(ADOQuery1.FieldCount));预期结果RecordCount应该等于你表里的实际行数在ctStaticclUseClient下。Eof在Open之后、没有调First之前通常是False因为游标默认指向第一行之前的位置。FieldCount等于SELECT语句里字段的数量。第三步点击按钮执行完整遍历。Memo1里应该逐行输出每条记录的信息最后一行显示总行数。如果Memo1是空的检查ADOQuery1.Open是否真的执行了以及Eof是否一开始就是True说明查询结果为空。第四步验证Eof判断的边界情况。把SQL改成SELECT * FROM Customers WHERE 10这样查询结果为空。再跑一次预期输出“查询结果为空没有可遍历的行。”而不是进入while循环。这验证了IsEmpty判断和Eof的配合是正确的。第五步验证字段取值。如果某个字段在数据库里是NULLFieldByName(字段名).AsString会返回空字符串.AsInteger会返回 0。如果你需要区分NULL和空字符串用FieldByName(字段名).IsNull判断。第六步验证游标类型的影响。把CursorType改成ctForwardOnly再跑一次。你会发现RecordCount返回 -1但遍历本身仍然能正常工作前提是你不调First。如果你在ctForwardOnly下调了First会报“不支持的操作”或者类似的异常。这个对比实验能帮你理解不同游标类型的差异。成功跑通之后你应该能看到类似这样的输出第 1 行 | IDALFKI | 公司Alfreds Futterkiste | 联系人Maria Anders 第 2 行 | IDANATR | 公司Ana Trujillo Emparedados | 联系人Ana Trujillo ... --- 共读取 91 行 ---行数和你数据库里的实际记录数一致字段值没有乱码中文正常显示。如果中文乱码检查数据库的字符集和 Delphi 的字符串类型Access 一般用 UnicodeDelphi 2009 以后string默认是 Unicode通常不会有问题。如果你在验证过程中想快速生成测试数据可以用 TaoToken 的模型对话功能让模型帮你写一段插入测试数据的 SQL然后贴到 Access 里执行。这比手动敲几十条INSERT快得多。5. 本篇常见错误排查401、local proxy failed、reading choices、OAuth这一节把新手在 ADO 游标遍历和 TaoToken 接入过程中最容易遇到的报错整理出来给出原因和解决方向。错误一ADO 报“未找到提供程序。可能未正确安装。”这是最常见的问题。原因是ConnectionString里的 Provider 和你的数据库文件格式不匹配。.mdb用Microsoft.Jet.OLEDB.4.0.accdb用Microsoft.ACE.OLEDB.12.0。如果你用的是 64 位 Delphi还需要安装 64 位的 ACE 引擎32 位 Delphi 装 32 位引擎。两者不能混用。错误二RecordCount返回 -1不是错误是游标类型不支持。ctForwardOnly游标不维护总行数所以RecordCount返回 -1。如果你需要行数改用ctStatic或ctKeyset。另外CursorLocation设为clUseServer时某些数据库也不支持RecordCount。错误三遍历时死循环程序卡死检查while循环里有没有写ADOQuery1.Next。每次循环必须移动游标否则Eof永远不会变成True。另外如果你在循环里调用了ADOQuery1.First或者重新Open也会导致游标重置陷入死循环。错误四FieldByName报“字段未找到”字段名拼写错误或者SELECT语句里没有包含该字段。Delphi 的FieldByName是大小写不敏感的但拼写必须一致。如果字段名有空格或特殊字符用FieldByName(字段 名)或者用Fields[i]按索引访问。错误五TaoToken 接入报 401401 表示认证失败。检查 API Key 是否正确是否有多余的空格是否在请求头里正确设置了Authorization: Bearer 你的Key。如果你用的是 Claude Code 或类似工具检查配置文件里的 Key 字段名是否正确。API Keys 页面可以重新生成 Key接入文档里有完整的请求示例。错误六local proxy failed这个报错通常出现在你通过本地代理工具访问 TaoToken API 的时候。检查你的网络配置确认 Base URL 填写的是https://taotoken.net/api没有多余的路径或参数。如果你在环境变量里设置了HTTP_PROXY或HTTPS_PROXY尝试临时取消看是否能正常请求。错误七reading choices 相关报错这个报错一般出现在解析模型返回结果的时候。如果你用 Delphi 调用 TaoToken 的 API返回的 JSON 里choices数组可能为空或者结构和你预期的不一样。检查你的请求体里model参数是否正确messages格式是否符合要求。用模型对话页面先手动发一条消息确认返回结构再对照调整代码。错误八OAuth 相关报错如果你在配置 Claude Code 或其他工具时看到 OAuth 报错检查你的认证方式是否选对了。TaoToken 的 API 接入用的是 API Key不是 OAuth。如果你在工具里选了 OAuth 模式改成 API Key 模式填入正确的 Base URL 和 Key。错误九中文乱码Access 数据库里的中文在Memo1里显示为问号或乱码。检查 Delphi 的string类型Delphi 2009 以后默认 Unicode一般没问题。如果用的是老版本 Delphi需要把TADOQuery的Connection的ConnectionString里加上CharSetUnicode或者用WideString接收字段值。错误十ADOQuery1.Open报“连接忙”或“连接已打开”检查ADOConnection1.Connected是否已经为True以及是否有其他数据集正在使用同一个连接。一个TADOConnection可以同时被多个数据集使用但如果你在遍历一个数据集的过程中又去Open另一个数据集可能会冲突。确保遍历完成后再操作其他数据集。排查的时候建议把ADOQuery1.SQL.Text和ADOQuery1.CursorType、CursorLocation、LockType的值打印出来确认实际生效的配置和你预期的一致。很多时候问题就出在某个属性被设计期设置覆盖了或者代码里改的顺序不对。6. 继续深入把游标遍历用到实际项目里跑通基本的逐行遍历之后你可以把这个模式扩展到更实际的场景。一个常见的需求是分批处理。比如表里有十万行数据你不想一次性全部拉到客户端内存里可以用clUseServerctForwardOnly每次只读一部分处理完再读下一批。但要注意ctForwardOnly下不能回头所以你的处理逻辑必须是单向的。另一个场景是遍历过程中更新数据。用ltOptimistic锁在循环里Edit/Post。如果更新失败用try...except捕获异常记录出错的行号继续处理下一行。不要因为一行失败就中断整个遍历。如果你需要把遍历结果导出成 CSV 或 JSON可以在循环里拼接字符串最后统一写文件。拼接的时候注意字段值里可能包含逗号或引号需要做转义处理。对于需要频繁查询和遍历的 Delphi 项目把游标配置封装成一个通用的函数会省很多事function OpenReadOnlyDataSet(AQuery: TADOQuery; const ASQL: string): Boolean; begin Result : False; try AQuery.Close; AQuery.CursorType : ctStatic; AQuery.CursorLocation : clUseClient; AQuery.LockType : ltReadOnly; AQuery.SQL.Text : ASQL; AQuery.Open; Result : True; except on E: Exception do // 记录日志 end; end;这样每次查询只需要传 SQL 进去游标配置统一管理减少出错概率。如果你在写 SQL 或者排查报错时需要辅助可以用 TaoToken 的模型对话快速问一下把报错信息和相关代码贴进去让模型帮你分析。对于长期做 Delphi 开发的场景Coding Plan 提供了更稳定的调用额度。API Keys 页面可以管理你的 Key接入文档里有完整的参数说明和示例代码。最后提醒一点游标遍历的核心是控制好Eof和Next的配合以及选对CursorType。把这两个点吃透大部分逐行处理的需求都能覆盖。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

MySQL教务系统数据库设计实战:从ER图到可执行SQL 2026/10/2 17:23:25

MySQL教务系统数据库设计实战:从ER图到可执行SQL

简介:本资源是山东科技大学计算机科学与技术专业《数据库系统概论》课程设计的完整实验报告,面向高校数据库初学者与课程实践者,聚焦DBMS核心功能——表的创建与修改,帮助学生深入理解关系型数据库底层实现原理。报告由郑通同学于…

阅读更多 →
公共资源交易数据主题库建设:数据归集、治理与共享实践 2026/10/2 17:23:25

公共资源交易数据主题库建设:数据归集、治理与共享实践

在数字政府建设全面提速、数据要素市场化改革深入推进的当下,公共资源交易领域作为政府配置公共资源、服务市场主体、保障民生工程的核心场景,沉淀了海量真实、高价值、高权威的交易数据。工程建设招投标、政府采购、土地矿业权交易、国有产权流转等各类…

阅读更多 →
二手房交易数据库设计:SQL Server 2000生产级落地实践 2026/10/2 17:23:19

二手房交易数据库设计:SQL Server 2000生产级落地实践

简介:本资源是一份面向高校数据库课程设计与信息管理类实践教学的《二手房交易管理系统数据库概论课题设计》完整文档,适用于计算机、信息管理、房地产信息化等方向的本科生课程设计参考或毕业设计前期选题支撑。文档系统阐述了二手房交易场景下的数据库…

阅读更多 →
数据库试卷PDF结构化解析与自动化验证实践 2026/10/2 17:23:19

数据库试卷PDF结构化解析与自动化验证实践

简介:本资源是一套完整的《数据库系统概论》课程期末复习资料,面向高校计算机、软件工程及相关专业本科生,助力考前系统梳理核心知识点与应试能力。试卷涵盖实体联系类型、关系模型与代数运算、SQL综合应用、数据依赖与范式转换(3…

阅读更多 →
苹果AI免费背后:端侧推理与端侧小模型的降本增效账 2026/10/2 17:23:12

苹果AI免费背后:端侧推理与端侧小模型的降本增效账

iOS 27把苹果AI推到台前后,我被问得最多的问题就是:这玩意儿到底收不收费?网上铺天盖地都在说苹果AI免费,甚至有人直接喊出“无限免费”。作为一个从iOS 10时代就开始折腾系统自动化的老玩家,又做过几年端侧推理的性能…

阅读更多 →
Wand-Enhancer 完整指南:免费本地补丁,三分钟去掉 Wand 的两小时限制 2026/10/2 17:23:12

Wand-Enhancer 完整指南:免费本地补丁,三分钟去掉 Wand 的两小时限制

Wand-Enhancer 完整指南:免费本地补丁,三分钟去掉 Wand 的两小时限制 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer Wand&…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉