Delphi 数据库开发综合教程
Delphi 拥有强大的数据库开发能力,其核心优势在于 VCL (Visual Component Library) 和 FireDAC,对于新手来说,理解这两个核心概念是入门的关键。

- VCL (Visual Component Library):提供可视化界面组件,如
TDBGrid(数据网格),TDBEdit(数据编辑框),TDBNavigator(数据导航器) 等,这些组件可以直接与数据源连接,实现“所见即所得”的数据绑定。 - FireDAC (Firebird Direct Access Components):这是目前 Delphi 官方推荐、功能最强大的数据库访问框架,它是一个统一、跨平台、高性能的数据访问层,支持几乎所有主流数据库(如 SQLite, MySQL, PostgreSQL, SQL Server, Oracle, Firebird 等)。
本教程将以 FireDAC 为核心,讲解 Delphi 数据库开发的完整流程。
第一部分:核心概念与基础
在开始编码前,必须理解 Delphi 数据库开发的几个核心概念和组件之间的关系。
数据库访问架构 (三层模型)
一个典型的 Delphi 数据库应用程序由三层组成,它们协同工作,将数据显示在界面上。
- 数据集层: 代表内存中的一张数据表,它可以是表(
TTable)、查询(TQuery)或更现代的TFDMemTable。TFDMemTable是 FireDAC 中的内存表,功能强大,常用于缓存、临时数据处理和客户端/服务器架构中的客户端数据集。 - 数据访问层: 负责与物理数据库建立连接和执行 SQL 命令,在 FireDAC 中,核心组件是
TFDConnection,它就像一个数据库连接的“管道”。 - 数据控制层: 负责将数据展示给用户并允许用户交互,这些是 VCL 组件,如
TDBGrid,TDBEdit,TDBNavigator等。
核心组件及其关系
理解这些组件如何连接是关键。

| 组件 | 类型 | 作用 | 连接关系 |
|---|---|---|---|
TFDConnection |
数据访问 | 建立并管理到数据库服务器的连接。 | 无需直接连接到数据集,但通过 FDConnection1.Connected := True; 来激活连接。 |
TFDQuery |
数据集 | 执行 SQL SELECT 查询,返回一个只读或可更新的数据集。 |
FDQuery1.Connection := FDConnection1; |
TFDMemTable |
数据集 | 内存中的数据表,可以独立存在,也可以从 TFDQuery 或 TFDTable 加载数据。 |
FDMemTable1.LoadFromDataSet(FDQuery1, [mtcpoAll]); 或直接设置其 Connection 属性。 |
TDataSource |
连接器 | 桥梁,连接数据集层和数据控制层,每个数据控件都需要一个 TDataSource。 |
DataSource1.DataSet := FDQuery1; |
TDBGrid |
数据控制 | 以网格形式显示数据。 | DBGrid1.DataSource := DataSource1; |
TDBNavigator |
数据控制 | 提供记录导航(上一条、下一条、第一条、最后一条)和数据操作(插入、删除、编辑、保存、取消)按钮。 | DBNavigator1.DataSource := DataSource1; |
简单流程:
TFDConnection (连接数据库) -> TFDQuery (执行SQL) -> TDataSource (作为桥梁) -> TDBGrid (显示数据)
第二部分:实战教程 - 创建第一个 Delphi 数据库应用
我们将创建一个简单的应用程序,连接到 SQLite 数据库,并实现数据的增删改查。
步骤 1:准备工作
- 安装 Delphi: 确保你已安装 Delphi (推荐 10.4 Sydney 或更高版本)。
- 准备数据库: 我们使用轻量级的 SQLite,无需安装数据库服务器。
- 下载一个 SQLite 数据库管理工具,如 DB Browser for SQLite。
- 创建一个新的数据库文件,
C:\MyData\MyDatabase.db3。 - 在其中创建一个表
Employees:CREATE TABLE Employees ( ID INTEGER PRIMARY KEY AUTOINCREMENT, FirstName TEXT NOT NULL, LastName TEXT NOT NULL, Department TEXT, HireDate TEXT ); - 插入几条示例数据。
步骤 2:创建 Delphi 项目并添加 FireDAC 组件
- 在 Delphi 中,选择
File -> New -> VCL Forms Application - Delphi。 - 从 Tool Palette (工具面板) 中,找到 FireDAC 标签页。
- 向窗体上拖放以下组件:
TFDConnection: 默认名为FDConnection1。TFDQuery: 默认名为FDQuery1。TDataSource: 默认名为DataSource1。- 从 Data Controls 标签页拖放:
TDBGrid: 默认名为DBGrid1。TDBNavigator: 默认名为DBNavigator1。
步骤 3:配置 TFDConnection 连接
- 选中窗体上的
FDConnection1。 - 在 Object Inspector 中,找到
ConnectionDefName属性,点击下拉框,选择Add New...。 - 弹出 FireDAC Connection Editor 窗口。
- Base connection: 选择 SQLite。
- Driver: 保持默认的
SQLite。 - Definition name: 给你的连接起个名字,
SQLiteConnectionDef。 - Database: 点击右侧的 按钮,选择你之前创建的
C:\MyData\MyDatabase.db3文件。 - 其他选项保持默认即可。
- 点击 Test 按钮,如果显示
Connection definition successful,说明配置成功。 - 点击 OK 保存。
FDConnection1.ConnectionDefName应该已经自动设置为SQLiteConnectionDef。
步骤 4:配置数据流和数据控件
-
连接数据集和连接:
- 选中
FDQuery1,在 Object Inspector 中设置其Connection属性为FDConnection1。
- 选中
-
连接数据集和数据源:
(图片来源网络,侵删)- 选中
DataSource1,设置其DataSet属性为FDQuery1。
- 选中
-
连接数据控件和数据源:
- 选中
DBGrid1,设置其DataSource属性为DataSource1。 - 选中
DBNavigator1,设置其DataSource属性为DataSource1。
- 选中
步骤 5:编写代码加载数据
- 双击窗体空白处,生成
FormCreate事件,这是窗体创建时触发的理想位置。 - 在
FormCreate事件中编写代码:
procedure TForm1.FormCreate(Sender: TObject); begin // 1. 打开数据库连接 FDConnection1.Connected := True; // 2. 设置 SQL 查询语句 FDQuery1.SQL.Text := 'SELECT * FROM Employees ORDER BY ID'; // 3. 打开查询,执行 SQL 并将结果加载到内存 FDQuery1.Open; // (可选) 让 DBNavigator1 的按钮可用 DBNavigator1.Enabled := True; end;
步骤 6:运行和测试
按 F9 运行你的应用程序,你应该能看到 DBGrid 中显示了 Employees 表的所有数据,并且可以使用 DBNavigator1 来浏览记录。
恭喜!你已经成功创建了你的第一个 Delphi 数据库应用程序!
第三部分:实现数据的增删改查
在第二步的基础上,我们来完善 CRUD (Create, Read, Update, Delete) 功能。
添加界面元素
为了方便输入,我们添加几个 TEdit 控件来绑定到各个字段。
- 在窗体上放置几个
TEdit,分别命名为edtID,edtFirstName,edtLastName,edtDepartment,edtHireDate。 - 选中
edtFirstName,在 Object Inspector 中设置其DataSource属性为DataSource1,DataField属性为FirstName。 - 对其他
TEdit重复此操作,分别绑定到对应的DataField(LastName,Department,HireDate)。 - 注意:
ID字段通常是自增的,所以不需要绑定。
实现 "增" (Insert)
在 DBNavigator1 旁边添加一个 TButton,命名为 btnAddNew,并编写其 OnClick 事件:
procedure TForm1.btnAddNewClick(Sender: TObject); begin // 1. 进入插入模式 FDQuery1.Insert; // 等同于 FDQuery1.Append; // 2. 将焦点移到第一个输入框 edtFirstName.SetFocus; // 3. 清空导航器,因为此时记录还未保存 DBNavigator1.Enabled := False; end;
实现 "删" (Delete)
在 DBNavigator1 中已经内置了删除按钮,但为了用户体验,我们可以添加一个确认对话框,这需要处理 FDQuery1 的 BeforeDelete 事件。
// 在 FDQuery1 的 BeforeDelete 事件中
procedure TForm1.FDQuery1BeforeDelete(DataSet: TDataSet);
begin
// 弹出确认对话框
if MessageDlg('确定要删除这条记录吗?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
Abort; // 如果用户选择 "No",则取消删除操作
end;
实现 "改" (Update)
DBNavigator1 的编辑按钮 (Edit) 已经可以完成大部分工作,当用户点击编辑按钮后,FDQuery1 会进入 dsEdit 状态,用户可以直接在 TEdit 中修改数据。
保存所有更改
DBNavigator1 的 Post 按钮会将当前记录的更改(无论是新增、修改还是删除)提交到数据库,但为了确保数据完整性,我们通常会在窗体关闭时检查是否有未保存的更改。
// 在窗体的 OnCloseQuery 事件中
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
// 检查数据集是否有未提交的更改
if FDQuery1.State in [dsEdit, dsInsert] then
begin
// 提示用户
case MessageDlg('有未保存的更改,是否保存?', mtConfirmation, [mbYes, mbNo, mbCancel], 0) of
mrYes:
begin
FDQuery1.Post; // 保存更改
CanClose := True;
end;
mrNo:
begin
FDQuery1.Cancel; // 取消更改
CanClose := True;
end;
mrCancel:
begin
CanClose := False; // 取消关闭操作
end;
end;
end;
end;
第四部分:进阶主题
当你掌握了基础后,可以探索更高级的主题。
使用 TFDMemTable 作为客户端数据集
TFDMemTable 非常强大,尤其适合以下场景:
- 数据缓存: 从服务器加载一次数据,之后的所有操作都在内存中进行,减少数据库访问。
- 离线操作: 用户可以在没有网络连接时操作数据,稍后同步。
- 数据绑定: 可以直接绑定到任何数据源,而无需实时数据库连接。
基本用法:
- 在窗体上放置一个
TFDMemTable。 - 设置其
Connection属性为FDConnection1。 - 设置其
FetchOptions.Mode为fmAll(如果需要从查询加载所有数据)。 - 使用
LoadFromDataSet方法从TFDQuery加载数据:FDMemTable1.LoadFromDataSet(FDQuery1, [mtcpoAll]);
- 之后,将
DataSource1的DataSet属性指向FDMemTable1,所有操作都将在FDMemTable1中进行。 - 需要保存回数据库时,遍历
FDMemTable1,使用TFDQuery或TFDUpdateSQL执行相应的INSERT,UPDATE,DELETE语句。
使用参数化查询
为了防止 SQL 注入和提高代码可读性,应始终使用参数化查询。
// 在按钮的 OnClick 事件中
procedure TForm1.btnSearchClick(Sender: TObject);
var
DeptName: string;
begin
DeptName := InputBox('搜索', '请输入部门名称:', '');
if DeptName <> '' then
begin
// 清空之前的 SQL
FDQuery1.SQL.Clear;
// 添加带参数的 SQL
FDQuery1.SQL.Text := 'SELECT * FROM Employees WHERE Department = :DeptParam ORDER BY ID';
// 为参数赋值
FDQuery1.ParamByName('DeptParam').AsString := DeptName;
// 打开查询
FDQuery1.Open;
end;
end;
使用 TFDUpdateSQL 进行细粒度控制
TFDQuery 默认可以自动生成更新语句,但有时你需要更精确的控制(更新时只修改特定字段,或者处理复杂的业务逻辑),这时可以使用 TFDUpdateSQL。
- 将
TFDQuery1的UpdateOptions.UpdateTableName设置为你的表名Employees。 - 为
FDQuery1添加一个TFDUpdateSQL组件。 - 在 Object Inspector 中选中
FDQuery1,将其UpdateObject属性设置为FDUpdateSQL1。 - 选中
FDUpdateSQL1,在 Object Inspector 中可以分别定义SQL属性:ModifySQL: 当调用Post修改记录时执行的 SQL。InsertSQL: 当调用Post新增记录时执行的 SQL。DeleteSQL: 当调用Delete删除记录时执行的 SQL。
你可以在这些 SQL 中使用 OLD_字段名 和 NEW_字段名 来引用修改前后的值。
第五部分:资源与学习路径
- 官方文档 (最重要):
- Embarcadero DocWiki - FireDAC: 最权威、最全面的资料,包含所有组件的属性、方法和事件详解。
- 社区与论坛:
- Embarcadero Community: 官方社区,可以提问和交流。
- Stack Overflow: 标签
delphi和fireDAC下有海量问题和答案。 - Delphi Praxis: 德语论坛,但技术内容非常丰富,有英文版块。
- 视频教程:
- YouTube: 搜索 "Delphi FireDAC tutorial" 或 "Delphi database development",有很多优秀的频道,如
LearnDelphi.tv,Marco Cantù(Delphi 之父) 等。
- YouTube: 搜索 "Delphi FireDAC tutorial" 或 "Delphi database development",有很多优秀的频道,如
- 书籍:
- 《Mastering Delphi》 by Marco Cantù: 经典著作,涵盖 Delphi 开发的方方面面,包括数据库。
- 《FireDAC by Example》 by Nick Hodges: 如果你能找到,这是学习 FireDAC 的绝佳资源。
学习路径建议:
- 打好基础: 深刻理解 三层模型 和 组件关系。
- 动手实践: 跟随本教程,完整地做出一个 CRUD 应用。
- 进阶探索: 学习
TFDMemTable、参数化查询和TFDUpdateSQL。 - 学习企业级框架: 了解 MVC (Model-View-Controller) 模式,并尝试使用 Spring4D 或 MVVM 框架来组织你的代码,这将使你的应用更易于维护和扩展。
- 关注多平台: FireDAC 也支持 FMX (跨平台 UI 框架),了解如何将你的数据库应用部署到 Windows, macOS, iOS 和 Android。
希望这份详细的教程能帮助你顺利开启 Delphi 数据库开发之旅!
