(原)Lazarus 异构平台下多层架构思路、DataSet转换核心代码

 

背景:
1、很多情况下我们的终端与服务器是分离的,并且操作系统也可能会存在很大的不同。
2、近些年火爆的WebService技术和SaaS等概念也让我们的思想得以解放。
3、Lazarus是一款可以跨平台开发的工具,在精神上基本满足了我们Once Code愿望。
4、但Lazarus还存在很多的问题,即使原生的类、函数、过程也还会报错。
问题:
1、我需要做一个三层架构,实现WinCE(或Linux)终端进行数据采集处理。
2、涉及到跨网等情况不可能采用直连数据库的方式,而Lazarus对WebService又是一团糟。
3、我打算回到原始状态,建立三层架构(客户端、服务器、数据库)形式,客户端和服务器之间以Tcp方式进行数据交互。
4、Lazarus已经没有了TClientDataSet,经查找取而代之的是TMemDataset。
架构思路:
     1、服务器接收客户端请求,进行数据(与数据库交互)的处理,处理结果以流方式进行压缩、传输。
     2、客户端接收到流后进行解压、还原,进行本地化操作处理,将本地处理结果打包,发送至服务器。
 
核心技术:
1、Tcp传输,我采用lnet组件,因为它支持:Linux、Windows、Wince,参见我的另一个贴子,可以多线程处理事务。
2、DataSet网络传输,我打算做成XML再传,==吧想了很多方式但未实现,最后官网上看到了TMemDataset的介绍,用它解决了DataSet在服务器与客户端的类型化问题。
3、困扰了我两天的问题,下面是我写可行性测试代码关于DataSet处理的。
 
请各位笑纳:
 
procedure TFormMain.DataSetMethod();
var
   DSetSource,DSetObject:TMemDataset;
   streamSource,streamObject:TStream;
   str:String;
begin
   //发送端
   //进行原始数据集的处理
   DSetSource:=TMemDataset.Create(Self);
   DSetSource.FieldDefs.Add('NAME',ftString,20);
   DSetSource.CreateTable;
   DSetSource.Open;
   DSetSource.Append;
   DSetSource.FieldByName('NAME').Value:='aaa';
   DSetSource.Post;
   DSetSource.Append;
   DSetSource.FieldByName('NAME').Value:='bbb';
   DSetSource.Post;
   streamSource := TMemoryStream.Create;
   streamObject := TMemoryStream.Create;
   DSetSource.SaveToStream(streamSource);
   streamSource.ReadBuffer(str, streamSource.Size);          //从流读至串
   DSetSource.Close;
   //好了,在开始在这里写网络传输吧
   //这写了很多代码

   //接收端
   //进行目标数据处理
   streamSource.WriteBuffer(str, Length(str));               //从串写至流
   DSetObject.LoadFromStream(streamSource);
   DSetObject.Open;
   DBGridEmployee.DataSource.DataSet:=DSetObject;
end;
 
   欢迎各位留言交流。

posted @ 2011-03-02 15:48  禹过天晴  阅读(1486)  评论(4编辑  收藏  举报