(原)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;
欢迎各位留言交流。