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这个方法,返回各自的表名,其他的一句代码都不用写.

scktsrvr.exe是一个NT的服务程序,你用scktsrvr.exe -install安装之后,每次系统启动,它都会自动运行的。如果你的客户端用了socketconnection,每次连接应用服务器的时候,都需要通过scktsrvr.exe才能访问到你的应用服务器.

scktsrvr.exe -uninstall 即可卸载

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

  1. 日常安排php,PHP日常开发小技巧

    PHP日常开发小技巧 导语:PHP语言中,如果你懂得一些开发技巧,那么对你学PHP,会有很大的帮助.下面的是百分网小编为大家整理的PHP日常开发小技巧,希望对你能有所帮助. PHP批量取得checkb ...

  2. Silverlight 游戏开发小技巧:动感小菜单2

    Silverlight 游戏开发小技巧:动感小菜单2 动感小菜单其实是想模仿Apple的菜单按钮设计制作,但是画虎不成反类犬,看起来有点别扭,昨天各位园友提了这方面的建议,感觉太硬如果加入动画可能更好 ...

  3. Silve“.NET研究”rlight 游戏开发小技巧:传说中的透视跑马灯

    昨夜元宵佳节,各种灯会热闹非凡,伴随烟火灿烂好不热闹,可惜一点也没看着T_T,那就写一个跑马灯吧,可是跑马灯并不稀奇,各位高手们已经写过而且都各有特点,所以,写也要写点有特色的才好,游戏中经常能看到一 ...

  4. 一起谈.NET技术,Silverlight 游戏开发小技巧:动感小菜单

    网页应用受限于自身的浏览器范畴,不能把华丽效果完全展示,正是因为如此,在网页上诞生了无数绚丽的设计,虽然动感程度和桌面应用无法比拟,但是在UI上却下足了功夫,用户体验可以说无以伦比,比如说小小的菜单, ...

  5. Silverlight 游戏开发小技巧:轨迹跟随效果

    Silverlight 游戏开发小技巧:轨迹跟随效果 我们通常在游戏中有各种各样的粒子效果,其中有一种就是跟随鼠标发生的轨迹动画,在鼠标经过的地方会产生一些特效,这种方式我们在粒子当中经常使用,本篇使 ...

  6. 极客技术专题【009期】:web技术开发小技巧

    为什么80%的码农都做不了架构师?>>>    日期:2013-8-26  来源:GBin1.com 技术专题:Seajs介绍 (分享人:choaklin) 专题演讲稿:SeaJS的 ...

  7. idea 设置jdk_IDEA开发小技巧~jdk问题

    IDEA开发小技巧: objc[3248]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachin ...

  8. 一些Vue开发小技巧,让你开发更便捷

    Vue是一套用于构建用户界面的渐进式JavaScript框架.与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用.Vue的核心库只关注视图层,方便与第三方库或既有项目整合. 下面我们来看一些v ...

  9. Silverlight 游戏开发小技巧:实现街霸4的选人界面

    Silverlight 游戏开发小技巧:实现街霸4的选人界面 上一篇只是一个引子,用来说明Projection的基本操作,游戏研发都是用这些小的基本功能慢慢组合出来,其实这一篇仍然是Projectio ...

最新文章

  1. mysql编程的二维数组_调出mysql中数据,输出一个二维数组的表格
  2. C++ string 详解
  3. 倒序输出单链表的内容
  4. IHttpHandler的学习(0)
  5. Hadoop大数据分布式文件系统hdfs的Java操作
  6. win2008一键配置php mysql_Windows 2008一键安装包配置环境:Windows+IIS+Php+Mysql
  7. Java | 使用对数器判断自己的程序是否正确(generateRandomArray)
  8. 广西全国计算机二级考试内容,全国高校计算机等级考试(广西考区)二级考试大纲.doc...
  9. c语言延时函数delay_STM32中精确延时函数的实现
  10. 家庭记账本开发记录(4)
  11. ai人工智能的本质和未来_人工智能如何塑造音乐产业的未来
  12. Code jock使用笔记
  13. 【一千个论文合集】计算机科学的26个细分领域近年必读论文集合
  14. 单元刚度矩阵与刚度方程
  15. 如何解决服务器响应过慢的问题,服务器响应速度慢的处理方法
  16. 使用requests爬取携程网飞机票价格实例
  17. HTML表格制作学习提示
  18. Qt打包程序报错“应用程序无法正常启动(0xc000007b)”
  19. Java中的try-catch-finally
  20. MyExcel 2.1.2 版本发布,重要 Bug 修复

热门文章

  1. Font Awesome 完美的图标字体
  2. CentOS 6.4 安装RBTools 报错 ImportError: Entry point ('console_scripts', 'easy_install') not found...
  3. Java:XML篇,使用SAX写入XML数据
  4. 25美元 Linux PC 'Raspberry Pi' 一月上市
  5. 网络性能测试工具Iperf上手指南
  6. ESXI 4.0 升级 ESXI 4.1 手记
  7. Python 学习记录1
  8. hdu 1106 排序
  9. Python入门记录
  10. 去掉我的电脑中WPS,百度云,360,爱奇艺盘符