杰瑞科技汇

Delphi数据库开发教程该怎么学?

Delphi 数据库开发综合教程

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

Delphi数据库开发教程该怎么学?-图1
(图片来源网络,侵删)
  • 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)或更现代的 TFDMemTableTFDMemTable 是 FireDAC 中的内存表,功能强大,常用于缓存、临时数据处理和客户端/服务器架构中的客户端数据集。
  • 数据访问层: 负责与物理数据库建立连接和执行 SQL 命令,在 FireDAC 中,核心组件是 TFDConnection,它就像一个数据库连接的“管道”。
  • 数据控制层: 负责将数据展示给用户并允许用户交互,这些是 VCL 组件,如 TDBGrid, TDBEdit, TDBNavigator 等。

核心组件及其关系

理解这些组件如何连接是关键。

Delphi数据库开发教程该怎么学?-图2
(图片来源网络,侵删)
组件 类型 作用 连接关系
TFDConnection 数据访问 建立并管理到数据库服务器的连接。 无需直接连接到数据集,但通过 FDConnection1.Connected := True; 来激活连接。
TFDQuery 数据集 执行 SQL SELECT 查询,返回一个只读或可更新的数据集。 FDQuery1.Connection := FDConnection1;
TFDMemTable 数据集 内存中的数据表,可以独立存在,也可以从 TFDQueryTFDTable 加载数据。 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:准备工作

  1. 安装 Delphi: 确保你已安装 Delphi (推荐 10.4 Sydney 或更高版本)。
  2. 准备数据库: 我们使用轻量级的 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 组件

  1. 在 Delphi 中,选择 File -> New -> VCL Forms Application - Delphi
  2. Tool Palette (工具面板) 中,找到 FireDAC 标签页。
  3. 向窗体上拖放以下组件:
    • TFDConnection: 默认名为 FDConnection1
    • TFDQuery: 默认名为 FDQuery1
    • TDataSource: 默认名为 DataSource1
    • Data Controls 标签页拖放:
      • TDBGrid: 默认名为 DBGrid1
      • TDBNavigator: 默认名为 DBNavigator1

步骤 3:配置 TFDConnection 连接

  1. 选中窗体上的 FDConnection1
  2. Object Inspector 中,找到 ConnectionDefName 属性,点击下拉框,选择 Add New...
  3. 弹出 FireDAC Connection Editor 窗口。
    • Base connection: 选择 SQLite
    • Driver: 保持默认的 SQLite
    • Definition name: 给你的连接起个名字,SQLiteConnectionDef
    • Database: 点击右侧的 按钮,选择你之前创建的 C:\MyData\MyDatabase.db3 文件。
    • 其他选项保持默认即可。
  4. 点击 Test 按钮,如果显示 Connection definition successful,说明配置成功。
  5. 点击 OK 保存。FDConnection1.ConnectionDefName 应该已经自动设置为 SQLiteConnectionDef

步骤 4:配置数据流和数据控件

  1. 连接数据集和连接:

    • 选中 FDQuery1,在 Object Inspector 中设置其 Connection 属性为 FDConnection1
  2. 连接数据集和数据源:

    Delphi数据库开发教程该怎么学?-图3
    (图片来源网络,侵删)
    • 选中 DataSource1,设置其 DataSet 属性为 FDQuery1
  3. 连接数据控件和数据源:

    • 选中 DBGrid1,设置其 DataSource 属性为 DataSource1
    • 选中 DBNavigator1,设置其 DataSource 属性为 DataSource1

步骤 5:编写代码加载数据

  1. 双击窗体空白处,生成 FormCreate 事件,这是窗体创建时触发的理想位置。
  2. 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 控件来绑定到各个字段。

  1. 在窗体上放置几个 TEdit,分别命名为 edtID, edtFirstName, edtLastName, edtDepartment, edtHireDate
  2. 选中 edtFirstName,在 Object Inspector 中设置其 DataSource 属性为 DataSource1DataField 属性为 FirstName
  3. 对其他 TEdit 重复此操作,分别绑定到对应的 DataField (LastName, Department, HireDate)。
  4. 注意: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 中已经内置了删除按钮,但为了用户体验,我们可以添加一个确认对话框,这需要处理 FDQuery1BeforeDelete 事件。

// 在 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 中修改数据。

保存所有更改

DBNavigator1Post 按钮会将当前记录的更改(无论是新增、修改还是删除)提交到数据库,但为了确保数据完整性,我们通常会在窗体关闭时检查是否有未保存的更改。

// 在窗体的 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 非常强大,尤其适合以下场景:

  • 数据缓存: 从服务器加载一次数据,之后的所有操作都在内存中进行,减少数据库访问。
  • 离线操作: 用户可以在没有网络连接时操作数据,稍后同步。
  • 数据绑定: 可以直接绑定到任何数据源,而无需实时数据库连接。

基本用法:

  1. 在窗体上放置一个 TFDMemTable
  2. 设置其 Connection 属性为 FDConnection1
  3. 设置其 FetchOptions.ModefmAll (如果需要从查询加载所有数据)。
  4. 使用 LoadFromDataSet 方法从 TFDQuery 加载数据:
    FDMemTable1.LoadFromDataSet(FDQuery1, [mtcpoAll]);
  5. 之后,将 DataSource1DataSet 属性指向 FDMemTable1,所有操作都将在 FDMemTable1 中进行。
  6. 需要保存回数据库时,遍历 FDMemTable1,使用 TFDQueryTFDUpdateSQL 执行相应的 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

  1. TFDQuery1UpdateOptions.UpdateTableName 设置为你的表名 Employees
  2. FDQuery1 添加一个 TFDUpdateSQL 组件。
  3. 在 Object Inspector 中选中 FDQuery1,将其 UpdateObject 属性设置为 FDUpdateSQL1
  4. 选中 FDUpdateSQL1,在 Object Inspector 中可以分别定义 SQL 属性:
    • ModifySQL: 当调用 Post 修改记录时执行的 SQL。
    • InsertSQL: 当调用 Post 新增记录时执行的 SQL。
    • DeleteSQL: 当调用 Delete 删除记录时执行的 SQL。

你可以在这些 SQL 中使用 OLD_字段名NEW_字段名 来引用修改前后的值。


第五部分:资源与学习路径

  • 官方文档 (最重要):
  • 社区与论坛:
  • 视频教程:
    • YouTube: 搜索 "Delphi FireDAC tutorial" 或 "Delphi database development",有很多优秀的频道,如 LearnDelphi.tv, Marco Cantù (Delphi 之父) 等。
  • 书籍:
    • 《Mastering Delphi》 by Marco Cantù: 经典著作,涵盖 Delphi 开发的方方面面,包括数据库。
    • 《FireDAC by Example》 by Nick Hodges: 如果你能找到,这是学习 FireDAC 的绝佳资源。

学习路径建议:

  1. 打好基础: 深刻理解 三层模型组件关系
  2. 动手实践: 跟随本教程,完整地做出一个 CRUD 应用。
  3. 进阶探索: 学习 TFDMemTable、参数化查询和 TFDUpdateSQL
  4. 学习企业级框架: 了解 MVC (Model-View-Controller) 模式,并尝试使用 Spring4DMVVM 框架来组织你的代码,这将使你的应用更易于维护和扩展。
  5. 关注多平台: FireDAC 也支持 FMX (跨平台 UI 框架),了解如何将你的数据库应用部署到 Windows, macOS, iOS 和 Android。

希望这份详细的教程能帮助你顺利开启 Delphi 数据库开发之旅!

分享:
扫描分享到社交APP
上一篇
下一篇