FireDAC 学习 - 7:三层数据库,一次传递多个表的数据

Delphi FireDAC多线程实战:用TThread和连接池提升数据库处理速度(附GitHub样例解读) 本文详细介绍了Delphi FireDAC多线程数据库编程的实战技巧,包括线程安全模型、TThread基类设计和连接池优化策略。通过GitHub样例解读,展示了如何提升数据库处理速度并保持UI响应,特别适合处理大量数据操作的场景。 阅读详情

 

需求

在 MIDAS 架构下,主从表可以采用嵌套表的方式,一次性将多个嵌套的表的数据传递到客户端。假设有主从表 FdQuery1 和 FdQuery2,大致做法如下:

1. 在服务器端,FdQuery1 和 FdQuery2 分别对应数据库服务器里面的一个表。它们对应的表有主从关系,主表的主键字段名为 ID;从表的外键字段名也是 ID;

2. 服务器端,DataSource1 对应 FdQuery1。

3. FdQuery2 的 SQL 语句大概是:select * from Table2 where ID=:ID;

4. FdQuery2.MasterSource := DataSource1;

5. 服务器端放一个 DataSetProvider1,其 DataSet 为 FdQuery1; 到这里,通过 DataSetProvider1 输出给客户端的数据是一个嵌套表,也就是一次性输出了2个表(可以是多个嵌套表)。

6. 客户端,ClientDataSet1 的 ProviderName 设置为服务器端的 DataSetProvider1;

7. 客户端,设计期,双击 ClientDataSet1 弹出字段编辑框,此框的右键菜单里面有 Add All Fields 则会在里面增加字段。这些字段里面除了 FdQuery1 对应的表的所有字段,还多出来一个字段。这个字段其实就是嵌入在里面的从表。字段名就是 FdQuery2。

8. 客户端,设计期,ClientDataSet2 的 DataSetField 为上述的那个 FdQuery2 字段,双击 ClientDataSet2 弹出字段编辑框,右键菜单选择 Add All Fields 则从表(也就是 FdQuery2 对应的表)的所有字段加载进来。

9. 运行期,如果从 DataSetProvider1.GetRecords 方法获得的数据包(数据类型是 OleVariant)传递到客户端,将 ClientDataSet1.Data := 上述从服务器端获得的数据包; 则 ClientDataSet2 也同时有了数据。

在 FireDAC 架构下,我暂时还没搞清楚如何从 FdQuery 里面获得嵌套式主从数据。

但 FireDAC 可以将多个表的数据(无关是否嵌套)一次性输出给客户端。然后通过在客户端建立主从关系的办法来显示嵌套表的主从关系。

---------------  FireDAC 一次输出多个表的数据到客户端 --------------------

FireDAC 的实现方法

1. 和前面一样,服务器端 FdQuery1 和 FdQuery2 分别对应数据库服务器的两个表。

2. 拖一个 FDSchemaAdapter1 过来。将 FdQuery1 和 FdQuery2 的 SchemaAdapter 属性都指向 FDSchemaAdapter1;

3. 输出数据,代码如下:

FDSchemaAdapter1.SaveToStream(AStream, TFDStorageFormat.sfBinary);

4. 上述 AStream 就是服务器端输出的数据,同时包含了 FdQuery1 的数据和 FdQuery2 的数据。将这个数据传递到客户端以后,

5. 客户端,拖一个 FDSchemaAdapter3;

6. 客户端,拖两个 FDTableAdapter31 和 FDTableAdapter32;

7. 设置 FDTableAdapter31 和 FDTableAdapter32 的 SchemaAdapter 为 FDSchemaAdapter3;

8. 设置 FDTableAdapter31.DatSTableName 属性为 FdQuery1, FDTableAdapter32 的该属性为 FdQuery2。这里的名字一定要和服务器端的 FdQuery1 和 FdQuery2 的名字对应上,不能错,不能随便取名字。

9. 拖两个 FDMemTable31 和 FDMemTable32,分别设置其 Adapter 属性为 FDTableAdapter31 和 FDTableAdapter32;

10. 做好上述设置后,执行代码如下:

FDSchemaAdapter3.LoadFromStream(AStream, TFDStorageFormat.sfBinary);

也就是说,通过 FDSchemaAdapter3 加载 AStream 就可以同时为两个 FdMemTable 装载来自服务器端的数据。

11. 在客户端拖两个 DataSource31 和 DataSource32 过来分别对应 FDMemTable31 和 FDMemTable32;

12. 在客户端拖两个 DBGrid1 和 DBGrid2 过来对应上述两个 DataSource。

13. 到这里,运行代码,则可以在两个 DBGrid 里面看到客户端装载进来的数据。这里看到的从表的数据是全部数据,而不是类似 MIDAS 架构下嵌套表的主从数据。

14. 想要在 DBGrid 里面看到主从数据,设置 FDMemTable32 的几个属性:

14.1. MasterSource 为 DataSource31;

14.2. MasterFields 为 ID (关联的外键字段名);

14.3. IndexFieldNames 为 ID;如果不设置这个,从表 DBGrid 依然显示全部记录而不是跟随主表显示被主表的 ID 记录过滤后的记录。

15. 到这里,运行时客户端界面上两个 DBGrid 能够看到两个表的数据,而且是主从(Master - Detail)关系。

到这里,三层数据库在 FireDAC 底下如何一次从服务器端获得多个表的数据,方法已经搞定。如何将客户端的多个表的数据一次性提交过去(尤其是主从表,需要一次性提交,才能在服务器端的同一个交易里面搞定),下次再说。

C++Builder实战:从零构建带生产管理的进销存桌面系统 进销存系统是企业资源管理的核心,它通过整合采购、销售、库存等业务流程,实现数据流与业务流的统一,是提升运营效率、保障数据准确性的关键技术。其原理在于通过严谨的数据库设计(如单据头-明细结构、库存流水表)和事务控制,确保业务操作(如入库、出库)的原子性与数据一致性。对于中小型制造或商贸企业,一个定制化、高性能的进销存系统能精准匹配其独特的生产BOM(物料清单)管理和审批流程,突破通用软件或Excel+Access等简易方案的瓶颈。本文以C++Builder这一经典RAD工具为例,深入探讨如何利用其高效的VCL 阅读详情

相关推荐

C++Builder 5项目实战:从经典VCL开发到现代化重构指南

可视化组件库(VCL)作为高效的桌面应用开发框架,通过基于属性的组件化模型,实现了界面快速构建与业务逻辑的分离。其核心原理在于将UI元素封装为独立对象,通过事件驱动机制响应用户交互,在提升开发效率的同时,保持了底层C++代码的可控性。这一技术价值体现在能够大幅缩短从原型到产品的开发周期,特别适合需要快速迭代的工业控制、数据采集等场景。本文以经典著作《C++Builder 5编程实战》中的项目为例,深入探讨如何将基于BDE、Indy等传统组件的遗留系统,迁移至FireDAC、GDI+等现代技术栈,并解决多线程

weixin_30596023的博客 401

Delphi 中 FireDAC 数据库连接(定义连接)

连接定义是一组参数,它定义了如何使用特定的FireDAC驱动将一个应用程序连接到DBMS。它相当于一个BDE别名、ADO UDL(存储的OLEDB连接字符串)或ODBC数据源名称(DSN)。关于支持的数据库管理系统和相应的参数列表,见FireDAC数据库连接。

sensor_WU 博客 2561

Delphi程序设计与开发手册:GUI设计、多线程与数据库应用

Delphi作为一个高级语言开发环境,提供了对多线程的全面支持。Delphi中的TThread类是实现多线程的关键组件,它封装了线程的基本操作,使得开发者可以较为容易地进行多线程编程。TThread类实现了以下功能:简化线程的创建和启动流程。提供了挂起、恢复和终止线程的接口。允许线程访问所属组件的线程安全方法。支持线程间的事件通知机制。Delphi自1995年推出以来,一直是快速网络应用开发的首选工具之一。

weixin_42627459的博客 507

Delphi 中 FireDAC 数据库连接(总览)

本系列包含一组文章,描述了如何用在Delphi中使用FireDAC设置数据库驱动和管理数据库连接。描述了为什么一组选项使FireDAC成为一个灵活的数据库框架,以及如何使用这些选项。FireDAC提供了大量的选项,这些选项被组织成一个分层的选项系统。描述了如何存储和使用FireDAC连接参数以及连接定义的含义。为了指定连接参数,一个应用程序必须使用一个连接定义。描述了如何使用FireDAC打开和关闭与DBMS的连接。描述了如何使用FireDAC的离线模式,它允许你在不与数据库持续连接的情况下处理数据。

sensor_WU 博客 1467

delphi 官方提供的六十多个FireDAC例子

FireDAC是一套独特的通用数据访问组件,用于为Delphi和C ++ Builder开发多设备数据库应用程序。凭借其强大的通用架构,FireDAC支持从Delphi到InterBase,SQLite,MySQL,SQL Server,Oracle,PostgreSQL,IBM DB2,SQL Anywhere,Access,Firebird,Informix等的本地高速直接访问。 基于10年为数据库后端编写本地驱动程序的经验,FireDAC被构建为一个强大的访问层,支持构建真实世界高负载应用程序所需的所有功能。 FireDAC为访问不同的数据库后端提供了一个通用的API,而不会放弃对特定数据库特定功能的访问,也不会影响性能。 它使开发人员能够专注于开发应用程序,而不是关注数据库交互的复杂性。它提供了一组现代功能丰富的组件来解决所有主要的RDBMS环境。它使用一组组件来解决所有支持的RDBMS类型。它通过提供以下方面来降低总体拥有成本: 与单独的昂贵库相比,初始成本更低。 学习和熟悉独特的强大图书馆所需的时间更少。 针对不同数据库时的直接应用设计和开发。

利用delphi中的内存表来制作主从表

利用delphi中的内存表来制作主从表,可以替代access或sqlserver

FireDAC,ADO性能测试

数据量2w行,字段30个 第一次open fd读取数据用时363毫秒,ado用时783毫秒 第二次open fd读取数据用时10毫秒,ado用时553毫秒 遍历所有记录 第一次 fd读取数据用时2438毫秒,ado用时5590毫秒 第二次 fd读取数据用时1988毫秒,ado用时5548毫秒 -------------------------------------...

yhcad博客 4653

WebDriverAgent 菜鸟解析篇

WebDriverAgent 是一个用于模拟移动设备浏览器的 Python 库,可以用来在 PC 上模拟移动设备的浏览器操作,从而进行自动化测试。下面是一个菜鸟对 WebDriverAgent 源码的解析篇,希望能对初学者有所帮助。

DJ355的博客 1222

FireDAC 学习 - 8:三层数据库,一次提交多个表的数据

如本人上一篇博客《FireDAC 学习 - 7:三层数据库,一次传递多个表的数据》所说,可以一次性获取多个表的数据到客户端。 在客户端编辑完成后,同样可以一次性提交客户端的 Delta 到服务器端,最后提交给数据库服务器。先看代码: procedure TDataModule2.ApplyUpdates; var AStream: TMemoryStream; begin {--------------------------------------------------------------

pcplayer的博客 1664

FPGA时序约束:从时钟树到数据路径的深度解析与优化策略

本文深入解析FPGA时序约束的核心技术与优化策略,涵盖时钟树结构分析、时序报告解读和数据路径优化。重点探讨Vivado工具中的时序约束方法,包括时钟定义、异常约束和物理优化,帮助工程师掌握寄存器级时序分析和系统级协同设计,实现高性能FPGA设计。

u5v6w7的博客 652

告别模糊与偏色:使用RKISP Tuner为RK3588s+IMX415进行图像质量调优的实战心得

本文详细介绍了如何使用RKISP Tuner为RK3588s+IMX415进行图像质量调优的实战经验。从调试环境搭建到3A算法优化,再到画质增强模块的深度调参,提供了全面的技术指导和参数建议,帮助工程师解决噪声、色偏和细节模糊等常见问题,显著提升成像质量。

weixin_28729205的博客 452

FireDAC 学习 - 5:三层,远程提交,公文包模式

问题需求: 以前版本的 Delphi,三层架构的程序,采用 TClientDataSet 来作为客户端的内存表,所有用户操作都是针对 TClientDataSet 里面的记录进行增删改的操作。在这里,用户修改后的记录,叫做 Delta。操作完成后,可以实现以下功能: 1. 将用户增删查改从 ClientDataSet 里面读取出来,也即是 ClientDataSet.Delta,这是一个 Variant 类型的数据。通过网络通讯将这个数据传递给服务器端,服务器端可以直接把它赋予到一个服务器端的 Clie

pcplayer的博客 2709

Qwen3.6-27B本地部署实战:LM Studio配置、硬件门槛与避坑指南

大语言模型本地部署是当前AI工程落地的核心能力之一,其本质是将高参数量模型(如27B级)在受限硬件环境下实现低延迟、高稳定推理。关键技术原理涵盖量化压缩(如GGUF格式与q4_k_m精度权衡)、GPU显存分配策略(KV Cache管理与Offloading机制)、以及运行时环境兼容性(CUDA驱动、llama.cpp后端版本)。该能力直接决定私有化AI应用的技术可行性与成本边界,广泛应用于企业知识库构建、代码辅助、长文档分析等对数据主权和响应确定性要求高的场景。本文聚焦Qwen3.6-27B这一典型27B模

weixin_33272631的博客 467

FireDAC 学习 - 1

之前玩 Delphi,数据库部分,用得最多的是 TClientDataSet。这个 TClientDataSet 有很多玩法,重点是它可以作为一个独立的内存表,无论数据来自什么数据库都支持,并且可以把内容保存为文件,也可以把内容通过远程传递。 新的 Delphi,TClientDataSet 还在,但有了新的 FireDAC 的整套数据库访问控件,它也包含一个 TDfMemeTable 内存表控件。这个内存表控件该如何使用?比如,来自数据库的数据,该如何放进去? 开始学习 FireDAC 的玩法。这里大

pcplayer的博客 4495

关于SVPWM七段式五段式调制后的相电压和线电压波形——大疆DJI技术笔试

1.SVPWM七段式/五段式调制的相电压和线电压波形 脉宽调制(PWM)在并网变流技术中得到了广泛的应用。与正弦脉宽调制(SPWM)的控制方法相比,SVPWM方法具有直流侧电压利用率高,电压谐波小,易于数字化实现等显著的优点,从而使SVPWM在实际的应用中越来越普遍。TMS320F28335是32位浮点的DSP控制器,具有150MHz的高速处理能力,18路PWM输出,与前几代数字信号控制器相比,性能平均提高了50%。其中具体的SVPWM理论实现的原理,请参考我的博客永磁同步电机的矢量控制策略(七)一一一SV

昔时扬尘处 2万+

攻击时间控制的动态逆三维制导律(源代码)

%参考文献:《攻击时间控制的动态逆三维制导律》,哈尔滨工程大学学报,2010 %编程难点:视线坐标系与参考坐标系间的转换关系 一、采用本文方法结果 二、偏航通道采用增广比例导引律

算法小站 2393

DATASNAP为支持FIREDAC而增加的远程方法的数据类型TFDJSONDataSets

前面的博客提到用FIREDAC全面替代COM那一套东西:DATAPROVIDER,OLEVARIANT,CLIENTDATASET,DBEXPRESS。。。 显然,DATASNAP的远程方法必须增加对FIREDAC数据集直接序列的参数类型。 从XE5的UPDATE2开始增加一个新的单元文件:Data.FireDACJSONReflect TFDJSONDataSets是一个数据集列表对象,顾...

weixin_33913332的博客 162

【openwrt-21.02】T750 openwrt 双系统说明及切换方法

高度集成的 T750 平台大幅减少组件数量,为产品设计者提供更小的尺寸和更低的功耗。T750 采用先进的 7nm 制程,高度集成 5G 调制解调器和四核 Arm CPU,提供较强的功能和配置,设备制造商得以打造精巧的高性能 CPE 产品,如固定无线接入(FWA)路由器和移动热点。3. preloader 加载并启动 A 系统,若 A 系统的任一启动阶段加载失败,preloader 将重新加载并启动 A 系统 3 次,若 3 次均失败,则自动切换至 B 系统,加载并启动 B 系统。A/B 系统切换流程如下。

wgl307293845的博客 1414

再谈 FireBird 的自增字段用 FireDAC 来处理

基于 MIDAS 的多层架构的数据库程序,客户端是 ClientDataSet,数据库服务器是 FireBird,服务器端采用 FireDAC 的数据库控件,如何处理数据库端的自增字段。之前我有博客文章介绍具体做法。这里更新一下另外一种做法,。

pcplayer的博客 992

从生产订单到整车交付,SAP 离散制造在汽车行业里的真实落点

汽车行业谈数字化,很容易一上来就谈智能工厂、数字孪生、AI 排产、无人仓、视觉质检。可落到 SAP 项目现场,真正把工厂撑起来的,往往还是几个很朴素的问题,客户订单来了以后,BOM 能不能准确展开,物料能不能准时到线,产能有没有被过度承诺,生产订单能不能被车间正确执行,质量问题能不能追溯,成本能不能按工单和批次沉淀下来。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 113

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

FireDAC之TFDStoredProc

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33973600的博客 1092

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

DataSnap三层架构:从原理到实践,构建稳定分布式应用

分布式系统架构的核心在于分离关注点与高效通信,通过将应用逻辑划分为客户端、服务器与数据库三层,实现业务集中化与资源优化管理。其技术价值体现在提升系统可维护性、安全性与扩展性,尤其在需要集中管理业务逻辑的桌面应用场景中优势显著。DataSnap作为Delphi平台的三层架构框架,通过TCP/IP或HTTP/HTTPS协议实现远程方法调用,支持JSON序列化与RESTful接口,便于构建跨平台服务。本文以DataSnap为例,深入探讨三层架构的设计原理、数据库连接池优化及生产环境部署要点,为传统行业遗留系统维护

congli3478的博客 490

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

delphi xe firedac mysql_mysql – 使用参数Delphi XE7 Firedac

您没有引用显示的异常消息.这是原始邮件[FireDAC][Phys][MySQL] You have an error in your SQL syntax … near ''ORDER BY some_field'' at line 4.与你的引用相比[FIREDAC][PHYS][MYSQL] You have an error in your SQL syntax … near "ORDER...

weixin_30954879的博客 195

delphi xe firedac mysql_mysql – 使用参数Delphi XE7 Firedac

您没有引用显示的异常消息.这是原始邮件[FireDAC][Phys][MySQL] You have an error in your SQL syntax … near ''ORDER BY some_field'' at line 4.与你的引用相比[FIREDAC][PHYS][MYSQL] You have an error in your SQL syntax … near "ORDER...

weixin_35775969的博客 157
上一篇: FireDAC 学习 - 6:CachedUpdates 模式下查看被删除的记录
下一篇: FireDAC 学习 - 8:三层数据库,一次提交多个表的数据
pcplayer
博客等级 码龄26年 633粉丝 284原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值