再谈 FireBird 自增字段在ClientDataSet里如何处理

ZeosDBO 6.0.12源码编译与安装:老项目数据库访问层迁移的稳定选择 数据库访问层往往是业务系统中最难替换的部分,尤其当项目长期依赖特定IDE和商业组件时,跨平台迁移的成本会成倍放大。源码编译是获得可控、可维护组件的基础能力,而一套支持多数据库的访问组件则能帮助开发者将MySQL、PostgreSQL、SQLite等差异隔离在统一接口之后。ZeosDBO正是这样一款纯Pascal实现的开源数据库访问组件,它通过分层驱动架构屏蔽不同数据库的协议差异,配合TZConnection等组件,可快速接入VCL或Lazarus界面。在实际工程中,源码包的手动编译不仅能规避IDE版本绑定, 阅读详情

架构

数据库:FireBird;

客户端:ClientDataSet;

中间层(服务器端):FireDAC 的 FdQuery;

使用 ClientDataSet 就是使用了 Delphi 的 MIDAS 框架。在架构上,服务器端和客户端是分布在不同的电脑上,通过网络的方式进行交互。我比较喜欢采用 Delphi 自己的 WebService 的架构,服务器端是一个 WebService 服务器,客户端采用 HTTPRIO 或者 SoapConnection 连接服务器端。

使用这个框架的好处是,客户端和服务器端,在运行期,是可以不连接的。仅仅是从服务器读取数据或者向服务器端提交数据时,才需要连接。
因此,这种架构,非常适合一个硬件资源不大的服务器端,可以同时直接巨多的客户端。因为客户端并没有和服务器端保持一个长期连接。大部分时间,用户在客户端操作数据时,客户端和服务器端之间并没有交互,也就没有连接。

但是,因为没有连接,则客户端在使用数据库的自增字段时,就需要一点小技巧,但是并不需要写很多代码。

本文是针对标题描述的问题的一个测试代码进行撰写,这个测试代码是把作为服务器端的 FdQuery1 和 DataSetProvider1 放到 Form4 上面,同时,作为客户端的 ClientDataSet1 也放到 Form4 上面。在实际的应用程序中,ClientDataSet1 在另外一个单独的客户端程序里面。 

描述

首先, ClientDataSet 的字段里面,有一个 AutoGenerateValue 属性,设置为 arAutoInc 是没有任何作用的,不需要去在这个属性上面浪费时间。

前提:

在 FireBird 里面设计一个表,其中一个字段,设置为自增字段。对于 FireBird 数据库来说,它会产生一个 Generator (生成器)用来自动计算自增的那个整数,然后产生一个 Trigger (触发器)来在有新数据插入时,把 Generator 产生的数字写入自增字段。

操作:

以下描述都是设计期,无需写代码:

1. FireBird 设置一个整数字段为自增字段,也就是它会有一个生成器和一个触发器,当插入新记录时,触发器从生成器获得自增的数字写入新插入记录的该字段;
2. FireDAC 的 FDQuery1 对应有自增字段的表(select * from MyTable),设计期创建固定字段,然后选择该自增字段,在属性面板,找到该字段的属性:AutoGenerateValue,设置为 arAutoInc;
3. DataSetProvider1 指向 FdQuery1;设计期,属性面板里面找到它的 Options 拉开,找到属性:[poPropogateChanges],勾选。这个属性用于将运行期的自增字段的值返回给 ClientDataSet1;
4. 属性面板里面,找到 DataSetProvider1 的属性 ResolveToDataSet 设置为 True;
5. ClientDataSet1 的 ProviderName 设置为 DataSetProvider1;

接下来写一点代码

客户端代码:
procedure TDmInvoice.CldInvoice2024AfterInsert(DataSet: TDataSet);
begin
  with ClientDataSet1 do
  begin
    Tag := Tag -1;
    FieldByName('SNO').AsLargeInt := Tag;
  end;
  
end;

 这段代码的意思是,当 ClientDataSet1 有新记录插入,则自动为这个自增字段(一般是主键,必须要有值)写入一个顺序减少的负数。这里拿它的 Tag 属性来存储这个负整数。

服务器端代码:

选择 DataSetProvider1, 属性面板里面找到它的事件:AfterUpdateRecord ,双击,产生代码框架,填入以下代码:

procedure TForm4.DataSetProvider1AfterUpdateRecord(Sender: TObject;
  SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind);
begin
  DeltaDS.FieldByName('SNO').NewValue := SourceDS.FieldByName('SNO').Value;
end;
上述服务器端代码的解释:

目的:

客户端提交后,数据库把客户端提交的新插入记录,自动产生新的自增值;但我们要让这个值返回给客户端,让客户端把对应记录的负数值,变成数据库产生的自增值。
表现为客户端提交后,负数的自增字段的值自动变成了数据库里面的新记录的自增的整数值。

原理:
给 DataSetProvider1 的 Options 属性添加了 poPropogateChanges 则它会把客户端提交的 Delta 修改后返回给客户端。

打完收工。

这里利用了 FireDAC 的字段的 AutoGenerateValue 属性设置为 arAutoInc 来对应 FireBird 的自增字段。

单靠 ClientDataSet 自己去提交是搞不定的。而且 ClientDataSet 的 AutoGenerateValue 属性设置为 arAutoInc 不起任何作用。

这恐怕是写最少代码的办法了。

如果客户端不是 3 层架构,而是直接使用 FireDAC 作为客户端,则一行代码都不用写,设置好字段的属性就搞定了。

最后总结

这里的整个过程是:
1. ClientDataSet1 在新插入记录时,客户端自己为自己创建主键的负数值,填充用;
2. ClientDataSet1 提交,是提交数据给 DataSetProvider1,此时,默认是 DataSetProvider1 自己产生 SQL 语句去将客户端提交的数据写入数据库。但是,因为这里给 DataSetProvider1 的 ResolveToDataSet 属性设置为 True,则它把数据丢给它的 DataSet 也就是 FdQuery1 去向数据库提交。
3. FdQuery1 在向数据库提交的时候,因为在设计期已经指定该字段的 AutoGenerateValue 为 arAutoInc,因此,FdQuery1 会正确地向 FireBird 提交新插入记录,并且从 FireBird 获得新产生的自增字段值。
4. 然后,在 DataSetProvider1AfterUpdateRecord 事件方法里,从 SourceDS(这里就是 FdQuery1)获得数据库产生的自增值,赋予客户端提交的 DeltaDS,然后 MIDAS 会自动把这个值返回给客户端的 ClientDataSet1。
5. 到此,整个过程圆满完成。

Delphi内存表使用(TdxMemData,TVirtualTable,TFDMemTable)例子.rar 演示在Delphi上使用内存表存储数据的例子。TdxMemData 属于DevExpressVcl控件,TVirtualTable属于UniDAC控件,TFDMemTable属于FireDAC控件。经过测试证明,TFDMemTable性能最好! 立即下载

相关推荐

超详细!动态规划详解分析(典型例题分析和对比,附源码)

为啥要使用动态规划?什么时候使用动态规划?以下是我的一些理解和心得,如果你感兴趣,就接着往下看吧。 对您有帮助的话记得给我点个赞哟! 动态规划的基本思想 动态规划(Dynamic Programming,DP)算法通常用于求解某种具有最优性质的问题。在这类问题中,可能会有许多可行解,每一个解都对应一个值,我们希望找到具有最优值的解。 动态规划算法与分治法类似,其基本思想也是将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解中 得到原有问题的解。与分治法不同的是,动态规划经分解后得到的子问题

qq_44398094的博客 8万+

delphi7 clientdataset 详解

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

garfield0905的专栏 2490

openvpn 安装 (Alibaba Cloud Linux release 3 (Soaring Falcon))

1.错误:configure: error: libnl-genl-3.0 package not found or too old. Is the development package and pkg-config (/usr/bin/pkg-config) installed?# ta.key在/etc/openvpn/server/目录下可以如下配置,否则需要写完整路径。# 配置账号密码登录客户端需要ca证书(可选)# 证书校验算法 配置上面生成的完整路径。# ca证书 配置上面生成的完整路径。

dubhe_zhao的博客 2148

修改虫虫的三层数据库类中的一个单元文件untRmoDbClient.pas

虫子的三层数据库类很好用,使用中发现一个小问题,就是当数据库字段较多时,如果DBGEID中只显示其中几列的话,在修改数据后移动到下一行进,会出错,无法更新数据,检查是生成的UPDATE语句有问题,没有在DBGRID中显示的列也生成进去了,并给了个‘’空值,刚好数据库设置了字段不能为空,就报错了,根据自己实用,修改如下 {**************************************...

weixin_30911809的博客 225

Pseudobulk与FindMarkers单细胞差异基因分析实战对比

本文深入对比了单细胞差异基因分析中Pseudobulk与FindMarkers两种主流方法。通过实战演示,详细解析了二者在底层逻辑、数据准备、分析流程及结果解读上的核心差异,并提供了基于不同生物学问题与数据特点的选择策略,帮助研究者做出更精准的分析决策。

weixin_29218963的博客 332

新版本大疆智图4.5 永久许可摄影测量建模软件

大疆智图支持常见格式的成果输出,包括 TIFF 正射影像和高程模型、LAS 格式点云,以及 B3DM、OSGB、OBJ 等六种常用格式的三维模型,还包括 DXF 和 SHP 等格式的等高线。大疆智图 DJI Terra是领先的三维重建软件,提供先进的技术和简单的操作,一站式解决方案,从航线规划到数据的获取,以及模型重建、数据分析等都提供独一无二的支持,优化项目工程,提供自动化优势,获得更有效智能的决策和行动,最终用户可以获得理想的结果,减轻工作压力,提高作业效率。质量报告和剖面查看功能有助于分析点云质量。

qq_62821232的博客 6892

Firebird 数据库如何实现自增字段(Auto-Increment)

在实际应用中,如果你需要自定义序列的属性,可以通过添加相应的子句来修改这些默认值。这条语句是完全可行的,不需要设置初值,它用于创建一个名为 my_sequence 的新序列,且该序列将采用默认属性。的系统表,它包含了数据库中所有序列的信息。你可以通过查询这个系统表来查看序列的详细信息,如序列名、当前值、增量等。简单三步,就搞定了Firebird 数据库自增字段,现在插入数据时,就不需要指定id的值。这条简单的语句,你就能创建一个按照上述默认设置运行的序列。字段的值,触发器会自动处理。

i8013的专栏 627

Apollo EM Planner中路径-速度解耦优化的数学建模与仿真分析

摘要 Apollo EM Planner采用路径-速度解耦优化策略解决自动驾驶运动规划问题。该算法将时空轨迹规划分解为路径规划和速度规划两个子问题:首先在静态环境下生成几何最优路径,再优化沿路径的速度曲线。通过五次多项式表示路径和速度,构建包含平滑性、安全性、舒适性的多目标优化函数,并引入弹性模型处理动态障碍物约束。算法具有解耦优化、弹性适应、实时求解等特点,适用于高速公路、城市交叉口等多种场景。数学建模包括路径几何优化、速度动态优化和弹性势能函数,最终生成满足车辆动力学和环境约束的安全轨迹。

走向CTO的路上... 933

FIREDAC数据引擎

以前使用过BDE、ADO、DBX等数据引擎,后来发现它们都没有UNIDAC好用, 所以在很长的一段时间内中间件都使用UNIDAC作为数据引擎。 偶然的机会,使用了DELPHI XE5自带的FIREDAC数据引擎,在开发了几个项目以后 发现它完全可以同UNIDAC相媲美,但UNIDAC购买费用是几万美刀,而FIREDAC是免费的。 从此以后又可以少使用一个三方控件,真是一件高兴的事。 转载于...

weixin_30755709的博客 361

【深度学习】什么是自回归模型?

自回归模型是一种重要的时间序列模型,通过利用过去的值来预测当前或未来的值。它在统计学、经济学、自然语言处理等领域有广泛的应用。自回归模型的简单性和可解释性使其成为许多应用的首选,但在更复杂的情况下,可能需要结合其他模型如移动平均模型(MA模型)或混合模型(如ARIMA)来更好地捕捉时间序列中的模式。扩散模型(Diffusion Model)和自回归模型(Autoregressive Model)是两种不同的生成模型,各自有独特的特点和应用场景。

q742971636的博客 1670

pandas教程:2012 Federal Election Commission Database 2012联邦选举委员会数据库

里面包含了支持者的名字,职业和雇主,地址,赞助金额。我们可以已经能想到如何切割、整理数据,来提取赞助者的统计数据,或提取宣传活动的模式,这里我们展示一些不同的分析方法。可以看到有些职业是同一种工作类型,指代的是同一个东西。这两个连续操作是分别独立执行的,一个结束后,另一个才开始。上,这里我是把数据集压缩成了ZIP格式,解压后能正常导入)。我觉得也有必要好好了解一下,这个网站做了很好的讲解,),所以我们最好添加这样的信息。这样的情况,即把两个索引操作连在一起。,发现映射关系被正常执行了,所以这里的。

Cachel Wood的博客 349

Lazarus 下用unidac连接firebird

首先是安装: 软件:lazarus-1.2.2-fpc2.6.4-win32 控件:unidac5.39 1、打开lazarus→包→打开包文件 2、按顺序编译,然后安装 dac10、dacvcl10、dcldac10、unidac10、unidacval10、dclunidac10 3、选择安装 先编译、后安装 pgprovider10.lpk myprovide

1733

【ComfyUI】Z-Image 基础文生图 + 单LoRA

本文介绍了一个基于ComfyUI的Z-Image Turbo基础文生图工作流,采用轻量化UNet模型配合Qwen Image文本理解模型与LoRA风格注入,实现从文本到图像的快速生成。工作流结构清晰,包含模型加载、文本编码、采样解码等标准节点,在人物生成、构图稳定性和出图速度方面表现均衡。通过调整Prompt可控制生成内容,适合日常创作、教学演示及扩展进阶应用。

Mr数据杨 923

再谈 Firebird / Interbase 自增字段和WebService MIDAS 框架下的 ClientDataSet

架构: 1. 数据库服务器:FireBird; 2. WebService 服务器端,采用 FireDAC 控件 + DataSetProvider; 3. WebService 客户端,采用 ClientDataSet 绑定到服务器端的 DataSetProvider; 4. 数据库表名:TEST,有2个字段:XUHAO, DESC;其中 XUHAO 是整数,我希望它是个顺序自增的字段,是主键,也是本文关注处理的对象。 代码需求 上述架构下,连接数据库的控件,采用 FireDAC 还是其它

pcplayer的博客 937

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

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

MIDAS 框架下 Firebird 自增字段 ClientDataSet 里面的处理方法

虽然 Delphi 新推出了 DataSnap 模式的跨网络多层数据库框架,但我还是喜欢原来的基于 MIDAS 的多层数据库框架。如果要运行在 Internet 上,我更倾向于采用 WebService 架构下使用 MIDAS,这样比较少写代码。 进入正题。 MIDAS 框架下,从数据库到客户端是这样构成的: 1. FDConnection1 连接数据库; 2. FDQuery1 执行 select 语句获得表数据; 3. DataSetProvider1 连接 FDQuery1 4. C.

pcplayer的博客 659

Statistics and Machine Learning Toolbox

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

多层下firebird自增长字段的处理

使用unidac可以解决自增长字段处理的问题。 对于多层就是一个比较烦人的事情,解决办法:cliendataset中自增长字段的处理:id:自增长字段。在client中的处理方法:clientdataset.Fields.FieldByName('id').ReadOnly:=False;后面该怎么处理就怎么处理。忘了说一句:后台是unidac连接数据库。 对于firebird的处理更简单,解...

weixin_30708329的博客 180

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

FireBird的两个误区:动态参数传递出错Incorrect values within SQLDA structure

动态参数Incorrect values within SQLDA structure

1811

FIREDAC不能识别SQL的某些字段类型

FIREDAC不能识别SQL的某些字段类型 经常见有网友有类似的提问:请问各位,在DataSnap中使用SQL数据SUM函数,如果是统计浮点型数值的话,返回是乱码,哪位是什么原因?  其实这不是DATASNAP的问题,而是FIREDAC的。 SQL查询使用SUM(field)函数以后,FIREDAC便不能识别SUM()后的字段类型。 导致在客户端呈现的后果:数值显示不对。许多人遇到过了此种情况,认...

weixin_33696822的博客 304

clientdataset 遍历字段_ClientDataSet中动态添加计算字段

在ClientDataSet中静态添加字段很容易,但是要在ClientDataSet已经获得数据打开了数据集的情况下添加就麻烦了。下图为在已经取得数据的情况下动态添加字图,请看最后列:************************************************************************************************************...

weixin_28963585的博客 276

TClientDataSet的使用

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

Tercel99的专栏 4631

FireDAC 下的 Sqlite [6] - 加密

主要就是设置 TFDConnection 的两个链接参数: Password, NewPassword, 非常简单. const   dbPath = 'C:\Temp\SQLiteTest.sdb'; {建立加密数据库, 密码是 mm123} procedure TForm1.FormCreate(Sender: TObject); const   strTable = 'CREAT

虚月的专栏 999

【亲测免费】 数据集序列化工具:Delphi 和 Lazarus 的 JSON 与 DataSet 转换利器

Delphi 和 Lazarus 开发者福音!这里有一个开源项目,可以大大简化 JSON 与 DataSet 之间的转换工作。该项目名为 DataSet Serialize,它是一个为 Delphi 和 Lazarus (FPC) 提供的 JSON 到 DataSet 以及 DataSet 到 JSON 的转换器。 ## 1. 项目基础介绍及主要编程语言 DataSet Serialize 是

gitblog_00752的博客 765

Delphi 中操作MS SQL Server 返回刚插入的自增ID列值

在开发数据库的应用的时候,经常需要写入日志,比如某个日志需要记录用户打开程序的时间和用户关闭程序的时间,显然这是两个动作,因为用户打开程序可能需要使用一段时间才会关闭。那么当用户打开程序时,我们首先就需要插入一条日志记录,记录下当前用户打开的时间,同时需要返回当前日志的ID值(自增),以方便用户关闭程序时使用该ID更新日志记录的关闭时间字段。2. FDConnection 会把整个 ExecSQLScalar 中的语句整体作为一个事务(会话),所以即便是多账户操作插入,返回的ID也是正确的。

sensor_WU 博客 1034

多层结构中必不可少件TClientDataSet的全面剖析

多层结构中必不可少件TClientDataSet的全面剖析 Delphi常用日期函数 ClientDataSet 探讨   [ 日期:2005-06-19 ]   [ 来自:本站原创 ] ClientDataSet 探讨 1.    与TTable、TQuery一样,TClientDataSet也是从TDataSet继承下来的,它通常用于多层体系结构的客户端。很多...

weixin_33691700的博客 214

FireDAC如何连接ORACLE数据库

UniDac对Oracle的Direct连接,不需要套Oracle客户端dll,deploy时真的时方便又快捷。     FireDac连接Oracle,在没有Oracle Client的情况下,是可以连接上的。前提是需要文件oci.dll、oraocci11.dll、oraociei11.dll、orasql11.dll,这4个dll文件,可以放在Exe同一个目录下,或者path里面能找到

小宇飞刀的BLOG 4957

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

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

pcplayer的博客 992
上一篇: HP 笔记本重新安装 Windows 11 无法启动
下一篇: 给 DBGridEh 增加勾选用的检查框 CheckBox
pcplayer
博客等级 码龄26年 633粉丝 284原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值