news 2026/9/29 2:25:13

FireDAC 下的 Sqlite [5]:插入、更新、删除的配置骨架与验证

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FireDAC 下的 Sqlite [5]:插入、更新、删除的配置骨架与验证

1. FireDAC 连上 Sqlite 之后,增删改到底该怎么写才不翻车

FireDAC 下的 Sqlite 插入、更新、删除,是 Delphi 开发者把本地库真正用起来的第一道坎。连接能通、查询能出数据,不代表写入就稳:参数占位符写错、事务没提交、Refresh 时机不对、自增主键回填拿不到,任何一个都能让你盯着 DBGrid 发呆。这篇就聚焦 FireDAC 连接 Sqlite 之后的增删改落地配置,给你一套可复制的 FDConnection / FDQuery 参数骨架和 SQL 模板,插入、更新、删除各演示一步验证动作,保证数据变更可回滚、可复现。

适合谁看:已经能在 Delphi 里用 FireDAC 打开 Sqlite、会拖控件、但一写 INSERT/UPDATE/DELETE 就心里没底的同学。全文用最朴素的 VCL 窗体加按钮来跑,不依赖第三方框架,你照着敲就能复现。核心检索词就三个:FireDAC、Sqlite、插入更新删除,下面所有配置都围绕它们展开。

我试过把参数化 SQL 和字符串拼接混着用,结果遇到带单引号的姓名直接报语法错,后来统一改成占位符才消停。所以本文的骨架一律走参数绑定,不给你留拼接的坑。

2. 前置准备:TaoToken 与 FireDAC 环境各就各位

2.1 FireDAC 侧要拖的控件

在空白窗体上放这几个:TFDConnection、TFDPhysSQLiteDriverLink、TFDGUIxWaitCursor、TFDQuery、TDataSource、TDBGrid,再加四个 TButton 分别对应插入、更新、删除、查询。设计期把 FDQuery1.Connection 指向 FDConnection1,DataSource1.DataSet 指向 FDQuery1,DBGrid1.DataSource 指向 DataSource1。FDGUIxWaitCursor 的 Provider 设成 Forms,避免控制台程序里等待光标报错。

2.2 如果你还要接大模型做辅助生成

写 SQL 骨架时想让模型帮你补参数、解释报错,可以先把 TaoToken 的 Key 配好。注册入口在官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,登录后在控制台创建 API Key:https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 。接口地址统一用 https://taotoken.net/api ,不要带 UTM 后缀。想先验证模型通不通,用模型对话页 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 发一句话即可;长期写代码、跑 Agent 的,看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 。接入细节查文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,Claude Code 相关看 https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claude_code&utm_campaign=rewrite 。这部分只是辅助,主战场还是 FireDAC 本身。

3. 可复制配置:FDConnection 与 FDQuery 参数骨架

3.1 建库建表与连接串

先看建库这一段。数据库文件放在固定路径,方便反复删除重建,保证每次实验都是干净状态。

procedure TForm1.FormCreate(Sender: TObject); const dbPath = 'C:\Temp\SQLiteTest.sdb'; strTable = 'CREATE TABLE MyTable(' + 'Id integer PRIMARY KEY AUTOINCREMENT, ' + 'Name string(10), Age byte)'; begin if FileExists(dbPath) then DeleteFile(dbPath); FDConnection1.ConnectionString := 'DriverID=SQLite; Database=' + dbPath; FDConnection1.ExecSQL(strTable); FDQuery1.Open('SELECT * FROM MyTable'); end;

这里DriverID=SQLite是 FireDAC 识别 Sqlite 驱动的关键,Database指向具体文件。integer PRIMARY KEY AUTOINCREMENT让 Id 自增,插入时不用管它。建表用 ExecSQL,查询用 Open,两者别混。

3.2 参数化插入模板

插入统一走占位符,值用数组按顺序给,比 Format 拼接安全得多。

procedure TForm1.Button1Click(Sender: TObject); const strInsert = 'INSERT INTO MyTable(Name, Age) VALUES(:name, :age)'; begin FDConnection1.ExecSQL(strInsert, ['AAA', 11]); FDConnection1.ExecSQL(strInsert, ['BBB', 22]); FDConnection1.ExecSQL(strInsert, ['CCC', 33]); FDConnection1.ExecSQL(strInsert, ['DDD', 44]); FDConnection1.ExecSQL(strInsert, ['EEE', 55]); FDQuery1.Refresh; end;

:name、:age是命名占位符,数组顺序必须和 SQL 里出现的顺序一致。写错顺序不会报错,但数据会串位,这是最常见的隐形坑。

3.3 更新与删除模板

更新用 WHERE 锁定目标行,删除用条件批量清。

procedure TForm1.Button2Click(Sender: TObject); begin FDConnection1.ExecSQL('UPDATE MyTable SET Age=:a WHERE Name=:n', [Random(100), 'AAA']); FDQuery1.Refresh; end; procedure TForm1.Button3Click(Sender: TObject); begin FDConnection1.ExecSQL('DELETE FROM MyTable WHERE Age>33'); FDQuery1.Refresh; end;

更新里:a在前、:n在后,数组就是[Random(100), 'AAA'],顺序对齐。删除条件Age>33会一次干掉多行,执行前最好先 SELECT 数一下影响范围。

3.4 参数对照表

配置项取值说明
DriverIDSQLite指定 Sqlite 驱动
DatabaseC:\Temp\SQLiteTest.sdb库文件绝对路径
占位符:name / :age命名参数,数组按序赋值
刷新方式FDQuery1.Refresh写操作后同步 DBGrid
自增字段Id AUTOINCREMENT插入时不赋值

注意:ExecSQL 用于 INSERT/UPDATE/DELETE,Open 用于 SELECT,用反了会抛异常或拿不到结果集。

4. 验证请求:插入、更新、删除各跑一步看结果

4.1 插入验证

点 Button1 后,DBGrid 应出现五行:AAA/11、BBB/22、CCC/33、DDD/44、EEE/55。如果只出现部分,检查数组顺序和 Refresh 是否执行。想确认自增主键,可以加一句查询:

var V: Variant; begin V := FDConnection1.ExecSQLScalar('SELECT Age FROM MyTable WHERE Name = :x', ['BBB']); ShowMessage(VarToStr(V)); end;

ExecSQLScalar 拿单值,这里应弹出 22。它适合做存在性校验,比如插入后确认某行确实落库。

4.2 更新验证

点 Button2,AAA 的 Age 会被随机数覆盖。因为用了 Random(100),每次点结果不同,正好验证更新确实生效。DBGrid 里 AAA 那行的 Age 变了,说明 UPDATE 命中。若没变,先确认 WHERE 的 Name 值拼写和库里一致,Sqlite 默认区分大小写。

4.3 删除验证

点 Button3,Age 大于 33 的行被清掉。按上面的数据,DDD/44、EEE/55 会消失,剩下 AAA、BBB、CCC。删除后 DBGrid 行数减少,就是成功信号。想更稳,可以在删除前用 ExecSQLScalar 数一下SELECT COUNT(*) FROM MyTable WHERE Age>33,心里有数再动手。

4.4 事务与回滚

默认每条 ExecSQL 自动提交。要保证一组操作可回滚,显式开事务:

FDConnection1.StartTransaction; try FDConnection1.ExecSQL('INSERT INTO MyTable(Name, Age) VALUES(:n, :a)', ['FFF', 66]); FDConnection1.ExecSQL('UPDATE MyTable SET Age=:a WHERE Name=:n', [77, 'FFF']); FDConnection1.Commit; except FDConnection1.Rollback; raise; end;

Commit 前任何一步出错,Rollback 都能把整组撤销,这就是可回滚、可复现的基础。

5. 本篇常见错排查

5.1 报 "no such table: MyTable"

多半是建表没执行成功,或者 Database 路径指向了另一个文件。检查 FormCreate 里 ExecSQL(strTable) 是否真的跑了,路径是否和查询时一致。Sqlite 不会自动建库文件,路径写错会新建一个空库,表自然不存在。

5.2 参数数量不匹配

报 "Array index out of bounds" 或参数个数错误,通常是占位符数量和数组元素数量对不上。数一遍 SQL 里的冒号,再数数组,一一对应。命名占位符重复出现时,FireDAC 按出现顺序取值,重复的也要重复给值。

5.3 更新删除影响 0 行

SQL 没报错但数据没变,先查 WHERE 条件。Name 值带空格、大小写不一致、Age 类型不匹配都会导致命中 0 行。用 ExecSQLScalar 先 SELECT 同条件数一下,能快速定位。

5.4 DBGrid 不刷新

写操作后忘了 FDQuery1.Refresh,界面还是旧数据。Refresh 会重新执行当前 SELECT,代价不大,增删改后都加上。如果 Refresh 报数据集未打开,先确认 FDQuery1 处于 Active 状态。

5.5 自增 Id 拿不到

插入后想立刻拿新 Id,用SELECT last_insert_rowid():

var NewId: Int64; begin FDConnection1.ExecSQL('INSERT INTO MyTable(Name, Age) VALUES(:n, :a)', ['GGG', 88]); NewId := FDConnection1.ExecSQLScalar('SELECT last_insert_rowid()'); ShowMessage(IntToStr(NewId)); end;

这是 Sqlite 的标准做法,别去猜 Id 值。

6. 把骨架用起来:下一步怎么接

到这里,FireDAC 下 Sqlite 的插入、更新、删除骨架就齐了:连接串固定 DriverID 加 Database,写操作走 ExecSQL 加命名占位符,读操作走 Open,改完 Refresh,成组操作套事务。你可以把这套模板直接搬进自己的项目,把表名和字段换掉即可。

如果你在写这些 SQL 时想让模型帮忙补参数、解释报错,或者做代码审查,可以走 TaoToken 的 API:https://taotoken.net/api ,Key 在 https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 创建,接入方式看文档 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。长期做 Delphi 编码和 Agent 自动化的,Coding Plan 在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 。先把上面四个按钮跑通,再谈扩展。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 2:25:04

MCU产品EFT防护实战:从PCB布局到固件容错的系统设计指南

1. 从一次深夜整改说起:MCU的EFT到底难在哪做硬件这行十几年,最怕的不是功能调不通,而是功能全对、实验室里跑得好好的板子,一到客户现场就随机死机、复位、通信丢包。你查电源、查时钟、查固件,折腾几天几夜&#xff…

作者头像 李华
网站建设 2026/9/29 2:24:58

CCV NNC Dataframe 详解:以 Pull 模型驱动异步数据加载与训练

计算机视觉深度学习 【免费下载链接】ccv C-based/Cached/Core Computer Vision Library, A Modern Computer Vision Library 项目地址: https://gitcode.com/gh_mirrors/cc/ccv 点击查看 免费下载 导读 CCV(C-based/Cached/Core Computer Vision Libr…

作者头像 李华
网站建设 2026/9/29 2:24:26

MySQL数据库参数调优

一、基础配置 [mysqld] # 声明以下配置属于MySQL服务器(mysqld)[mysqld]:配置文件的模块标识,表示这是 MySQL 服务器的配置段。 二、路径与基础设置 datadir/var/lib/mysql socket/var/lib/mysql/mysql.sock pid-file/var/run/mys…

作者头像 李华