|
|
背景:
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处理的。
请各位笑纳:
PS:源码不太稳定,有些问题,修改后即可上传。
4月18日上传代码:
MemDataset与XML互转的代码,这里给出的已实际应用于项目,关于数据行,可以通过循环的方式来处理,
procedure TFormMain.WriteDataSet();
var
xdoc: TXMLDocument;
noEntity,
noTable,
noColumns,
noColumn,
noPrimaryKey,
noRows,
noRow,
noField,
noValue :TDOMNode;
begin
//create a document
xdoc := TXMLDocument.create;
xdoc.Encoding := 'utf-8';
//根节点
noEntity := xdoc.CreateElement('Entity');
Xdoc.Appendchild(noEntity);
//表
noTable := xdoc.CreateElement('Table');
TDOMElement(noTable).SetAttribute('Name',UTF8Decode('TS_EMPLOYEE'));
noEntity.Appendchild(noTable);
//列集合
noColumns := xdoc.CreateElement('Columns');
noTable.Appendchild(noColumns);
//列
//第一列
noColumn:= xdoc.CreateElement('Column');
TDOMElement(noColumn).SetAttribute('Name',UTF8Decode('EMPLOYEEID'));
TDOMElement(noColumn).SetAttribute('Type',UTF8Decode('ftInteger'));
TDOMElement(noColumn).SetAttribute('Size',UTF8Decode('20'));
noColumns.Appendchild(noColumn);
//第二列
noColumn:= xdoc.CreateElement('Column');
TDOMElement(noColumn).SetAttribute('Name',UTF8Decode('EMPLOYEENAME'));
TDOMElement(noColumn).SetAttribute('Type',UTF8Decode('ftInteger'));
TDOMElement(noColumn).SetAttribute('Size',UTF8Decode('20'));
noColumns.Appendchild(noColumn);
//主键
noPrimaryKey := xdoc.CreateElement(' rimaryKey');
TDOMElement(noPrimaryKey).SetAttribute('Name',UTF8Decode(' rimaryKey'));
noTable.Appendchild(noPrimaryKey);
//主键列
noColumn:= xdoc.CreateElement('Column');
TDOMElement(noColumn).SetAttribute('Name',UTF8Decode('EMPLOYEEID'));
noPrimaryKey.Appendchild(noColumn);
//数据行
noRows := xdoc.CreateElement('Rows');
noEntity.Appendchild(noRows);
//第一行
noRow:= xdoc.CreateElement('Row');
noRows.Appendchild(noRow);
//第一列
noField:= xdoc.CreateElement('EMPLOYEEID');
noValue := xdoc.CreateTextNode(UTF8Decode('7777'));
noField.Appendchild(noValue);
noRow.Appendchild(noField);
//第二列
noField:= xdoc.CreateElement('EMPLOYEENAME');
noValue := xdoc.CreateTextNode(UTF8Decode('9999'));
noField.Appendchild(noValue);
noRow.Appendchild(noField);
writeXMLFile(xDoc,'teste.xml');
Xdoc.free;
end;
procedure TFormMain.ReadDataSet();
var
xdoc: TXMLDocument;
noEntity,
noTable,
noColumns,
noColumn,
noPrimaryKey,
noRows,
noRow,
noField,
noValue :TDOMNode;
strTable,
strColumn,
strType,
strSize,
strField,
strValue:string;
i,j:integer;
strColumns: Array of string;
mDataSet:TMemDataset;
begin
ReadXMLFile(xdoc, 'teste.xml');
//实体信息,可以忽略
noEntity := xdoc.FindNode('Entity');
Memo.Lines.Add(noEntity.NodeName);
//表信息
noTable := noEntity.FindNode('Table');
strTable := noTable.Attributes.GetNamedItem('Name').NodeValue;
Memo.Lines.Add(noTable.NodeName +' '+strTable);
//构造实体
mDataSet:= TMemDataset.Create(Self);
mDataSet.Name:= strTable;
//字段信息
noColumns := noTable.FindNode('Columns');
SetLength(strColumns,noColumns.ChildNodes.Count);
with noColumns.ChildNodes do
begin
for i:=0 to (Count-1) do
begin
strColumn :=Item.Attributes.GetNamedItem('Name').NodeValue;
strColumns := strColumn;
strType :=Item.Attributes.GetNamedItem('Type').NodeValue;
strSize :=Item.Attributes.GetNamedItem('Size').NodeValue;
Memo.Lines.Add( ' '+Item.NodeName
+ ' '
+ strColumn
+ ' '
+ strType
+ ' '
+ strSize
);
mDataSet.FieldDefs.Add(strColumn,
TFieldType(GetEnumValue(TypeInfo(TFieldType), strType))//,
//strToInt(strSize)
);
end;
end;
//主键信息
noPrimaryKey := noTable.FindNode(' rimaryKey');
Memo.Lines.Add(noPrimaryKey.NodeName +' '+noPrimaryKey.Attributes.GetNamedItem('Name').NodeValue);
with noPrimaryKey.ChildNodes do
begin
for i:=0 to (Count-1) do
begin
Memo.Lines.Add( ' '+Item.NodeName
+ ' '
+ Item.Attributes.GetNamedItem('Name').NodeValue );
end;
end;
mDataSet.Open;
//数据信息
noRows := noEntity.FindNode('Rows');
with noRows.ChildNodes do
begin
for i:=0 to (Count-1) do
begin
mDataSet.Append;
for j:=0 to Item.ChildNodes.Count-1 do
begin
strValue:= UTF8Encode(Item.ChildNodes[j].FirstChild.NodeValue);
mDataSet.FieldByName(strColumns[j]).AsString:=strValue;
Memo.Lines.Add(strValue);
end;
end;
mDataSet.AppendRecord(['15555','1111']);
end;
Datasource1.DataSet:= mDataSet;
xdoc.Free;
end;
欢迎各位在群里与我交流,最个问问题的那个人就是我。 |
评分
-
查看全部评分
|