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

基因ID转换避坑指南:如何用org.Hs.eg.db把ENSEMBL ID变成可读的gene symbol

本文详细介绍了如何将RNA-seq等数据中常见的ENSEMBL ID转换为可读的基因符号(Gene Symbol),重点对比了biomaRt与org.Hs.eg.db两大工具的优劣,并深入剖析了多对多映射、版本号失效及非编码基因Symbol缺失三大核心陷阱。文章提供了针对TCGA、GEO等不同数据源的定制化处理方案与完整的稳健转换流程,帮助生物信息学分析者避免常见错误,确保下游分析的准确性。

weixin_28223453的博客 700

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

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

pcplayer的博客 1664

从DCI-P3到sRGB:跨媒体色彩转换的矩阵奥秘与实践

本文深入解析从DCI-P3到sRGB的色彩空间转换技术,揭示矩阵运算的核心原理与实践技巧。通过实战案例展示如何正确处理白点差异、伽马曲线转换等关键环节,帮助影视从业者解决跨媒体色彩匹配问题,确保作品在不同设备上呈现一致的视觉效果。

weixin_28709649的博客 328

医学图像处理实战:3D Slicer从安装到病灶分析全流程指南

本文提供了一份详尽的3D Slicer实战指南,涵盖从软件安装、DICOM数据导入到图像增强、病灶分割及三维可视化的全流程。重点演示了如何利用阈值分割、区域生长等核心图像处理技术进行病灶分析,并生成定量报告,是医学影像分析初学者的实用入门教程。

weixin_29278805的博客 600

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

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

pcplayer的博客 2709

从MC到DC:三维重建算法的核心原理与实战对比

本文深入对比了三维重建领域两大经典算法Marching Cubes(MC)与Dual Contouring(DC)的核心原理与实战表现。MC算法原理直观、实现简单,但存在特征丢失和二义性问题;DC算法通过求解二次误差函数(QEF)和利用法向量信息,能更好地保留模型的尖锐特征,但计算更复杂。文章结合医学影像处理实例,为开发者根据速度、精度和特征保真度需求选择合适算法提供了清晰指南。

weixin_29251131的博客 1032

FireDAC 学习 - 1

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

pcplayer的博客 4495

【Maxwell16.0】实战指南:从DXF导入到MotorCAD联合仿真的关键技巧

本文详细解析了Maxwell 16.0与MotorCAD进行联合仿真的核心流程与关键技巧。重点阐述了从DXF模型导入、几何修复、一极一槽模型剪裁,到坐标系对齐、MotorCAD参数匹配及结果验证的全过程,旨在帮助工程师高效打通联合仿真链路,规避常见错误,提升电机设计效率。

weixin_29062865的博客 715

WinServer 2012 R2 搭建 AD 单域多站点 及 DNS各站点的子网掩码排序调整

WinServer 2012 R2 搭建 AD 单域多站点 及 DNS各站点的子网掩码排序调整

一直被模仿,从未被超越 5533

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

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

weixin_33913332的博客 162

Qt C++ 卫星数据接收与处理界面

打开 `MainWindow.ui`,你会发现我们完全是在代码中 (`setupUI`) 创建的 UI。* 访问 [QCustomPlot 官网](https://www.qcustomplot.com/) 下载最新版本的 `qcustomplot.h` 和 `qcustomplot.cpp` 文件。* 对于 FFT,可以使用专门的库如 [FFTW](http://www.fftw.org/),或者 Qt 5.15 及以上版本中提供的 `QFFT` 和 `QComplex` 类。

寒寒豆豆软件公司的博客 148

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

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

pcplayer的博客 992

Python 爬虫实战:京东商品价格与评论数据爬取

本文介绍了使用Python爬取京东商品价格与评论数据的完整流程。主要内容包括: 环境准备:安装requests、BeautifulSoup、pandas等库,建议使用Python 3.8+虚拟环境。 目标分析: 商品列表页(HTML)包含名称、价格、SKU ID等数据 评论数据通过JSON API获取 反爬策略: 随机User-Agent 请求延迟2-5秒 设置必要Cookie 代码实现: 基础配置:设置输出目录、随机UA生成器 搜索列表页爬取:解析HTML获取商品基本信息 评论数据爬取:通过JSON AP

u014481728的博客 420

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

FireDAC之TFDStoredProc

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

weixin_33973600的博客 1092

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

congli3478的博客 490

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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、付费专栏及课程。

余额充值