在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
首先,在中间层添加一个方法,就叫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这个方法,返回各自的表名,其他的一句代码都不用写. |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论