Delphi 的 DataSetProvider.Options 里面的 poCascadeUpdates 修改嵌套表的主键

Delphi CxGrid的主从表显示设置 3:填好从表的 detaikeyfieldNames与masterkeyfieldnames。界面编辑建立两个不同级别的视图层级-Layout。1:填好主表的keyfieldnames。2:填好从表的keyfieldnames。其实这是一个主从表关系, 阅读详情

缘起

用 Delphi 的多层数据库开发框架,实现一个多层的主从表,从服务器端到客户端,可以采用这样的架构会让代码比较简单:

1. 假设数据库里面有 2 个表,构成主从表的架构;比如,一个是学生名单表,以身份证号码为主键,这个表是主表;有一个学生各科成绩表,每个学生每科(语文,数学,外语)一条记录,作为从表。

2. Delphi 的服务器端,使用 2 个 FdQuery 对应上述两个表。其中,FdQuery1 对应学生明单表,是主表。FdQuery2 对应成绩表,是从表。一个 DataSource1 指向 FdQuery1,然后 FdQuery2 的 MasterSource 指向 DataSource1,MasterField 设置为主键(身份证号码字段);然后,放置一个 DataSetProvider1 它的 DataSet 设置为 FdQuery1;

3. Delphi 的客户端:ClientDataSet1 的 ProviderName 设置为服务器端的 DataSetProvider1;给 ClientDataSet1 在设计期增加字段,Delphi IDE 自动从服务器端获得字段数据,自动填充字段。这些字段里面,有一个字段是代表了服务器端的 FdQuery2;然后设置 ClientDataSet2 的 DataSetField 为前述字段(IDE 里面的属性面板里面找到 DataSetField 属性,下拉,就能选择)。

经过上述散布,一个简单的 3 层架构的嵌套表的编辑界面就有了。

好处:

这样的嵌套表界面的好处是,在客户端修改了主表和从表的数据,只需要提交 ClientDataSet1,而且,在服务器端的 DataSetProvider1.BeforeUpdateRecord 事件里面,可以看到主表修改的数据,也可以看到从表修改的数据,在这里,可以写入业务逻辑代码,比如某个字段不允许修改。

问题

上述架构下,新增主表和从表的数据,然后提交,没问题。同时修改了主表和从表的数据然后提交,也没问题。但是,如果要修改主表的主键字段的值,Delphi 直接弹出异常提示:没用 Cascade XXX

问题的解决

解决以上问题,需要做以下几步:

1. 首先,在数据库里面(我这里使用的是 FireBied 数据库),给从表设置一个指向主表主键的外键,并且这个外键需要设置为 Cascade Updates;这个必须是数据库本身支持的才行;

2. DataSetProvider1 的 Options 里面,设置 poCascadeUpdates 属性为 True (属性面板里面选择打勾);

完成上述两步,再次运行程序,你会看到,如果在客户端修改了主表的主键字段的值,从表的主键字段的值自动跟随变化。修改后如果执行 ClientDataSet1.ApplyUpdates(0) 提交客户端的数据,在数据库里面,主表和从表的主键字段的值都被更新了。

探索

如果在 DataSetProvider1.BeforeUpdateRecord 里面写代码跟踪,假设上述操作仅仅修改了主表的主键的值,这个事件里面它只触发了一次主表的提交,没用从表的提交动作。因此,真正的同时修改主表和从表在数据库里面的值,是数据库自己实现的。

如果数据库里面没用为从表创建外键,只是 DataSetProvider1.Options 里面为 poCascadeUpdates 属性打勾,可以从 DataSetProvider1.BeforeUpdateRecord 事件里面看到仅仅触发了一次主表的提交动作,再看数据库,仅仅是主表的主键值更新了,从表没有。

当然,如果从表里面修改了其它字段,在 DataSetProvider1.BeforeUpdateRecord 里面仍然能够触发相应的事件的。

另外:

假设我们有 4 个表:T1, T2, T3, T4;

T1 是主表,T2,T3 是 T1 的从表;T4 是 T3 的从表。构成了 2 级主从嵌套;

仍然采用上述服务器端嵌套表的架构。T2, T3, T4 都有外键指向主表的主键。

此时,在客户端,修改了主表的主键,会看到 T2, T3 的主键自动跟随改变,但 T4 的主键没用变化。但是,如果此时提交,在数据库里面,T1, T2, T3, T4 的主键都同时被更新了。在 Delphi 这边,仅仅需要刷新一下显示就可以了。客户端刷新显示,最简单的代码就是:ClientDataSet1.Refresh;

总结

1. 普通用法:假设主表和从表的非主键字段的值在客户端同时被修改,提交后,会在服务器端的 DataSetProvider1.BeforeUpdateRecord 触发事件。可以在事件里面判断当前触发的是主表还是从表。因为程序员知道每个表的字段名称,因此可以针对当前触发事件的表的记录的每个字段,进行权限控制,或者值的修改,等等。也就是业务逻辑控制在服务器端,安全性更高。

2. 修改主键:嵌套表如果修改主键,采用设置 DataSetProvider1.Options 里面的 poCascadeUpdates 属性的方式,客户端修改主表主键值,从表自动跟随变化;客户端提交,在 DataSetProvider1.BeforUpdateRecord 事件里面,只有主表提交,没用从表提交的事件。这种情况从表的更新,依靠的是数据库本身的主从表设置 -- 也就是数据库里面为从表创建指向主表主键的外键。

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

相关推荐

delphi 主从表

delphi 主从表delphi

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

需求 在 MIDAS 架构下,主从表可以采用嵌套表的方式,一次性将多个嵌套的表的数据传递到客户端。假设有主从表 FdQuery1 和 FdQuery2,大致做法如下: 1. 在服务器端,FdQuery1 和 FdQuery2 分别对应数据库服务器里面的一个表。它们对应的表有主从关系,主表的主键字段名为 ID;从表的外键字段名也是 ID; 2. 服务器端,DataSource1 对应 FdQuery1。 3. FdQuery2 的 SQL 语句大概是:select * from Table2 w...

pcplayer的博客 4310

Delphi主从表自创实例

Delphi主从表自创实例

Delphi中ado+datasetprovider+clientdataset控件,执行更新clientdataset.applyupdates(0) 多表 更新单表 解决方法

1.先给ado控件指定字段(可以双击---add all fields)。 2.将不需要更新的字段的【providerflags】属性的pfInput和pfInWhere设置为false)。     注:在ADO操作多数据时,默认ADO是要提交多个表相关的语句,因此必须设置数据集字段的providerflags字段,当将pfInput和pfInWhere字段设置为false后,这样就可...

彩色羽翼 的专栏 2089

TClientDataSet用法

delphi的TClientDataSet用法,客户端数据处理详解

Ubuntu 24.04.3 LTS 安装 OpenClaw 图文版

OpenClow安装指南

qq_17204557的博客 2551

Delphi clientdataset的详细介绍

delphi Midas SQLServer的自增字段的处理1.新增时,表中有自增字段,但是不希望用Refresh,直接ApplyUpdates直接看见自增字段的值在DataSetProvider.AfterUpdateRecord写如下代码 1 2 3 4 5 6 7 8 9 10 11 12

u013293793的专栏 2767

用 Python 和 uiautomation 实现微信批量发送

思路是这样,将要发送的人员名单(包括称呼)以及发送内容都维护到Excel里,程序运行时读取Excel里内容,自动搜索人员姓名(微信昵称或备注名),填入要发送的内容,拼接上称呼(如果需要的话)自动点击发送,这样轮巡直至名单人员全部发送完成。、

jankingdom的专栏 1471

Delphi实现网页表单数据的自动提交

  MSHTML是微软公司的一个COM组件,该组件封装了HTML语言中的所有元素及其属性,通过其提供的标准接口,可以访问指定网页的所有元素.MSHTML对象模型是由一些对象和集合组成的.处于根部的是HTML,描述了打开页面的1个窗口,包括一系列集合和对象。如Frames集合,History,Location,Navigator,Document,Vi—sum,Event对象等.其中描述

虫二的专栏~~在路上~~~ 1888

汇川PLC程序框架设计:模块化分层与标准化实践指南

在工业自动化领域,可编程逻辑控制器(PLC)是设备控制的核心大脑。其编程质量直接决定了系统的稳定性、可维护性与开发效率。遵循高内聚、低耦合的软件工程原则,通过模块化分层设计,能够将复杂的控制逻辑分解为硬件驱动、设备控制、流程管理等清晰层级,并利用功能块(FB)封装可复用的设备控制逻辑。这种结构化方法的技术价值在于大幅提升代码的可读性、可测试性与团队协作效率,有效降低后期维护与功能迭代的难度。其应用场景广泛覆盖从单机设备到复杂产线的自动化项目。本文聚焦于汇川PLC平台,深入探讨如何构建一套融合了**状态机编程

weixin_29188997的博客 400

USB2.0基础知识总结

目录 1、协议层: 1.1、域分类 1.2 、USB传输方式: 1、协议层: 域和包定义:包是一次传输的单位,每个包由多个域组成; USB中是按照LSB进行字节传输; 1.1、域分类 1.1.1: 同步域(SYNC field) 所有的包都开始于同步域,在低速和全速通信中SYNC field用7个0和1个1来表示。 由于USB2.0使用了NRZI编码(0用翻转来表示,1用不翻转表示),所以00000001就是上图那样。 ...

qq_32938605的博客 4408

Borland DataSnap(MIDAS)三层架构编程中,DataSetProvider的Option属性

Borland DataSnap(MIDAS)三层架构编程中,DataSetProvider的Option属性DataSetProvider的Option属性 看看远端数据模块里的DataSetProvider的Option属性是否设置正确!Provider控件的Options属性值是一个集合,用于设置有关打包和传递的选项,像显示哪些字段、允许哪种更新方式等等。1.         poFetchBlobsOnDemand:若包含此项,则表示数据包中不包括BLOB字段。不过,如果客户端的TclientDat

xxhh07的专栏 1247

STM32硬件SPI驱动W5500以太网模块全流程(附避坑指南)

本文详细介绍了STM32硬件SPI驱动W5500以太网模块的全流程,包括硬件架构设计、SPI接口选型、官方驱动移植、网络协议栈配置与优化等关键步骤。通过实战案例和性能对比数据,帮助开发者快速实现稳定高效的网络连接,特别提供了常见问题排查指南和性能调优技巧。

weixin_29194693的博客 268

技巧:Delphi中三层主从表制作

中间层    adcnet: TADOConnection;    adqM: TADOQuery;    dspM: TDataSetProvider;    dtsM: TDataSource;    adqD: TADOQuery;连接方法  adqM.Connection:= adcnet;  dspM.DataSet:= adqM;  dtsM.DataSet:= adqM; 

SGM的博客 1695

python语言下使用opencv接口cv2.VideoCapture()接口调用海康机器人工业相机

文章目录 目录 文章目录 前言 一、opencv接口介绍 二、调用海康机器人工业相机 1.使用海康机器人工业相机的前提 2.调用海康机器人工业相机进行显示 3.调用海康机器人工业相机进行存图 4.调用海康机器人工业相机存视频 5.调用海康机器人工业相机进行简单图像处理 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下.

qq_39570716的博客 1万+

新手必看:Infineon Memtools烧录配置全流程(附常见错误解决方案)

本文为嵌入式开发新手提供了Infineon AURIX开发环境搭建与Memtools烧录的全流程实战指南。详细解析了ADS、DAS和Memtools三大核心工具的角色与协同关系,并重点讲解了Memtools的图形界面配置步骤、烧录操作流程,以及针对“无法连接设备”、“编程失败”等常见错误的系统性排查与解决方案,帮助开发者快速上手并规避典型陷阱。

weixin_29189377的博客 634

Delphi 三层 TClientDataSet(2)

delphi Midas SQLServer的自增字段的处理 1.新增时,表中有自增字段,但是不希望用Refresh,直接ApplyUpdates直接看见自增字段的值 在DataSetProvider.AfterUpdateRecord写如下代码 DataSetProvider.Options.poPropogateChanges:=True; procedure TForm1.DataS

流年~~ 2431

深度解析:LPDDR5 Receiver 的挑战与应对

LPDDR5 的数据速率已经来到Tbit​DataRate1​≈156ps在6400Mbps时也就是说,。👉 这就是为什么成为 LPDDR5 的“标配”。

weixin_43199439的博客 211

delphi7 clientdataset 详解

delphi Midas SQLServer的自增字段的处理1.新增时,表中有自增字段,但是不希望用Refresh,直接ApplyUpdates直接看见自增字段的值在DataSetProvider.AfterUpdateRecord写如下代码 1 2 3 4 5 6 7 8 9 10 11 12

garfield0905的专栏 2490

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Delphi中ClientDataSet的用法小结

      TClientDataSet控件继承自TDataSet,其数据存储文件格式扩展名为 .cds,是基于文件型数据存储和操作的控件。该控件封装了对数据进行操作处理的接口和功能,而本身并不依赖上述几种数据库驱动程序,基本上能满足单机"瘦"数据库应用程序的需要。      一、TClientDataSet的基本属性和方法介绍     1、FieldDefs: 字段定义列表属性      ...

Delphi、Java、Ext、Ubuntu 784

NTscan扫描工具

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

Delphi TFDCustomSchemaAdapter TFDTableAdapter 主从表 集中式更新总结

DBMS identifier. So, if the application is connected to this DBMS, then the Y text will be substituted into command. 因此,如果应用程序连接到这个 DBMS,那么 Y 文本将被替换为命令。Time constant. must be specified in 'hh24:mi:ss' format. 时间常数。在某些情况下,应用程序需要指定另一个 DB 表名,更新将发布到该表。

1948

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

技巧:Delphi中主从表用法

ADO中ADOTable、ADOQuery和ADODataSet主从表设置1、ADOTable的主从表设置主表名为jxc_out,从表名为jxc_out_detl   主表与从表关联字段为draw_notbM: TADOTable;tbD: TADOTable;dtsM: TDataSource;dtsD: TDataSource;tbM.TableName=jxc_outtbD.Ta

SGM的博客 4039

Delphi主从表例子

 在sql server 的northwide 中建立主表create table sell_h( sell_id char(10),cust_name char(10) Primary key(sell_id) )gocreate table sell_h( sell_id char(10),inv char(10) ,amt float,qty float Primary key(sell_i

Tercel99的专栏 1万+
上一篇: 把 TObjectList 序列化为 JSON
下一篇: Firebird + FireDAC 界面操作的自增字段
pcplayer
博客等级 码龄26年 633粉丝 284原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值