Delphi三层开发小技巧:TClientDataSet的Delta妙用

Delphi做三层开发时,很多人都会在客户端放一个TClientDataSet,中间层远程数据模块就对应放一个TDataSetProvider,然后再连起来.其实这种方法很烦琐,而且程序痈肿不甘,不好维护.我们都知道TClientDataSet的Delta属性记录了数据的所有修改,应用它我们就可以方便的实现一个单表更新的通用方法.

首先,在中间层添加一个方法,就叫ApplyUpdates吧.方法定义如下:

function ApplyUpdates(const UpdateTable:String;Delta:Variant;out err:String):Boolean;

参数UpdateTable是指要更新的表名,Delta是指传过来的TClientDataSet的Delta属性,如果更新错误err返回错误的内容.下面实现这个方法,首先在DataModule上放一个Query,Query连上Connection,然后再放一个TDataSetProvider连Query.代码如下:

function TRoDm.ApplyUpdates(const UpdateTable:String;Delta:Variant;out err:String):Boolean;

const sql=‘select * from %s where 1<>1‘;

var sqlstr:string;

ErrCount:Integer;

begin

Result:=False;

sqlstr:=Format(sql,[UpdateTable]);

try

Conn.BeginTrans;

Query.Close;

Query.sql.text:=sqlstr;

Query.open;

Provider.ApplyUpdates(Delta,-1,ErrCount);

Result:=ErrCount=0;

if Result then

Conn.CommitTrans

else Conn.RollbackTrans;

except

on E:Exception do

begin

Conn.RollbackTrans;

err:=E.Message;

end;

end;

end;

到此,通用的更新方法已经完成了.不过客户端的ClientDataSet还不能查询显示数据,因此,还要写一个查询方法:

function QuerySQL(const sqlstr:string;out Data:Variant;out err:String):Boolean;

参数sqlstr就是要持行的查询语句,Data返回查询结果,错误时err返回错误消息

QuerySQL实现代码如下:

function TRoDm.QuerySQL(const sqlstr:string;out Data:Variant;out err:String):Boolean;

begin

Result:=False;

try

Query.close;

Query.sql.text:=sqlstr;

Query.sql.Open;

Data:=Provider.Data;

Result:=True;

Except

on E:Exception do

err:=E.Message;

end;

end;

到这里,中间层的代码已经完了,客户端的调用就简单了.比如客户端有个数据模块DM,上面放一个DcomConnection或者SocketConnection,名叫Conn.例如,我们现在要做一个商品管理的功能,在窗体上放一个TClientDataSet叫Cds,放DataSource,DBGrid等,设置好相应的属性.然后在窗体创建(Create事件)时查询回所有数据,代码如下:

const sql=‘select * from xxxx‘;

var Data:Variant;

err:String;

begin

if Dm.Conn.AppServer.QuerySQL(sql,Data,err) then

Cds.Data:=Data

else MessageBox(self.handle,pchar(‘查询数据出错:‘+err),‘错误‘,MB_OK+MB_ICONERROR);

end;

然后还有"添加","修改","删除"按扭,代码都和我们平时操作一样,比如"添加"按扭的代码:

cds.append;

cds.fieldbyname(‘xxx‘).asinteger:=xxx;

//....

cds.post;

修改,删除也这样写.不过现在还有个小问题是,这个表的主键的生成问题,这里我们不能用自增主键,要自己自己生成主键,这样你还得在中间层写一个中间层生成主键的方法,在"增加"按扭时生调用生成主键,然后再上面的操作.这里不再多说.

增删改完后,这时的数据还在客户端的内存里,想保存到远程的中间层服务器就要用到我们刚才的方法了,下面就是"保存"按扭下的代码:

var err:string;

begin

if cds.ChangeCount=0 then exit;//数据没改变就不用提交了

if Dm.Conn.AppServer.ApplyUpdates(‘xxx‘,cds.Delta,err) then//xxx就是表名了

begin

MessageBox(self.handle,‘保存成功!‘,‘提示‘,MB_OK+MB_ICONINFORMATION);

cds.MergeChangeLog;//合并所有改变的数据

end else MessageBox(self.handle,pchar(‘保存出错:‘+err),‘错误‘,MB_OK+MB_ICONERROR);

end;

到此,这篇文章也讲完了.用这个方法,那些单表的基础数据更新还可以写成一个祖先类,只要加一个取得更新表名的虚方法,比如:function TableName:string;virtual;然后其后代只要override这个方法,返回各自的表名,其他的一句代码都不用写.

原文地址:https://www.cnblogs.com/jijm123/p/11468572.html

时间: 2024-10-12 12:16:12

Delphi三层开发小技巧:TClientDataSet的Delta妙用的相关文章

php开发小技巧--快速环境搭建

前几天同学让我帮忙调试一个PHP后台的网站,我擦,我都没有环境你丫还非得让我本地跑,不肯给我权限.我只想说三个字,你丫就是王八蛋.希望你看不到我写的这篇文章. now,吐槽结束,正题开始.下面介绍快速搭建一个PHP开发环境搭建的小技巧.no big deal,就是一个开源的软件.名字是PHPnow.它是Apache+PHP+ MySQL环境套件包,这种集成的开发环境的好处是,它用脚本的方式帮你做了各种缺省的配置,满足你的基本的需求.如果想更高级,对不起,自己定制. 下面用一个很久之前写的程序演示

ios开发小技巧-用宏化简代码

在IOS开发中,要做字典转模型一般情况如下: 1 /** 2 * 声明方法 3 */ 4 - (instancetype) initWithDictionary:(NSDictionary *)dict; 5 + (instancetype) carWithDictionary:(NSDictionary *)dict; 6 7 /** 8 * 实现方法 9 */ 10 - (instancetype)initWithDictionary:(NSDictionary *)dict 11 { 12

开发小技巧2——代码段

概念: 代码段是将预先定义好的可重用代码块快速插入到代码文件中,代码段提高了开发效率,增强了代码的可重用性:既节约了时间,又实现了不同开发人员间代码的共享.同时也可保证同一项目中代码风格的统一. Visual Studio中已经定义了部分代码段,例如:在visual studio中输入for按tab健即可自动生成for循环语句,输入tryf按tab则自动生成try catch语句.       在Visual Studio 2012中创建自定义代码段: 选中项目文件,右击添加-新建项-选择XML

BizTalk开发小技巧

BizTalk开发小技巧 随笔分类 - Biztalk Biztalk 使用BizTalk实现RosettaNet B2B So Easy 摘要: 使用BizTalk实现RosettaNet B2B So Easy最近完成了一个vmi-hub的B2B项目,使用Rosettanet 2.0的标准与一家品牌商,OEM,供应商实现B2B.一共交换4个报文,4B2,3B2,4B2 POD,4C1,说白了就是收发存这些数据:项目环境BizTalk2009...阅读全文 posted @ 2015-10-2

27个iOS开发小技巧

<span style="word-wrap: normal; word-break: normal; line-height: 1.5em; font-size: 14px; outline: none; color: rgb(51, 51, 51); font-family: 'Helvetica neue', Helvetica, sTheiti, 微软雅黑, 黑体, Arial, Tahoma, sans-serif, serif;"><span style=

前端网络、JavaScript优化以及开发小技巧

一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN缓存 通过构建工具Gulp,可以在开发的时候就将合并压缩的事情一起做掉. 之所以要做合并压缩是因为:HTTP 1.x不允许一个连接上的多个响应数据交错到达(多路复用),因而一个响应必须完全返回后,下一个响应才会开始传输. 也就是说即使客户端同时发送了两个请求,而且CSS资源先准备就绪,服务器也会先发

.Net开发小技巧

.NET项目开发中的小技巧 1.不要频繁的创建对象...这个损失是巨大的...new太多了,后果比较严重. 2.打开数据库后要及时的关闭连接,如果你不能做到一个open后跟一个close,那也没关系,用Using满足你偷懒的欲望吧 3.别太迷信string str1 = "";和string.empty之间的差异,性能上和你想的完全不一样.放心大胆的使用""吧. 4.如果你的项目比较大,或者你的IIS服务器配置不太高,那么,我还是建议你多用存储过程,减少前端服务器的

iOS开发小技巧之--WeakSelf宏的进化

我们都知道在防止如block的循环引用时,会使用__weak关键字做如下定义: __weak typeof(self) weakSelf = self; 后来,为了方便,不用每次都要写这样一句固定代码,我们定义了宏: #define WeakSelf __weak typeof(self) weakSelf = self; 之后,我们可以比较方便的在需要的地方: WeakSelf; ... [weakSelf doSomething]; 再后来,我们发现不止self需要使用weak,可能有部分变

报表开发小技巧:报表的设计与配色技巧

1.示例工具 报表开发工具FineReport 2. 取色 2.1 设计器里取色 点击背景右侧的小三角,点击更多颜色,点击自定义选项卡,这里的HSL或者RGB值,就是我们需要得到的精确的颜色,如下图所示. RGB 是对机器很友好的色彩模式,但并不够人性化,因为我们对色彩的认识往往是"什么颜色?鲜艳不鲜艳?亮还是暗?"HSL 模式和 HSV(HSB) 都是基于 RGB 的,是作为一个更方便友好的方法创建出来的. HSL即色相.饱和度.亮度(Hue, Saturation, Lightne