delphi内存表
delphi内存表
delphi内存表最大的特点就是有data和delta属性,有了它,极大地简化了数据库CURD编程。这是其他语言所不具备的优势。
在当前流行软件平台化,IDL盛行的时候,可能也是其最大的缺陷。
就算FPC几乎山寨了整个delphi的数据集体系,但内存表的data和delta属性就是山寨不了。
1)TClientDataSet
早年datasnap基于COM,datasnap远程方法函数可以返回OLEVariant,TClientDataSet.Data和TClientDataSet.Delta的数据格式都是OLEVariant。
delphi数据集通过TDataSetProvider桥梁转换为OLEVariant。
DSP+CDS组合,firedac,unidac,ado,bde,dbx。。所有数据库引擎都支持。
CDS有一个惹人厌的问题,midas.dll,要是机器上有多个版本的midas.dll,简直是无限麻烦。解决方法:在工程文件 uses midas.dll。
CDS后来也支持linux,部署的时候,相应的要带一个特有的libmidas.so.2动态库。
CDS这一点是很让人诟病的。
1.1)查询
qry.Close; qry.SQL.Clear; qry.SQL.Text := req.asStr['sql' + i.tostring];
//qry.open; //此行代码千万不能有,否则会查询二次 result := dsp.Data;
1.2)保存
qry.Close; qry.SQL.Clear; qry.SQL.Text := 'select * from table where 1=2'; dsp.ApplyUpdates(delta, 0, err); //delta是客户端提交上来的数据 if err > 0 then begin //保存失败 end;
2)TFDMemTable
delphi为了支持跨OS,废掉了DBX,引入全新的firedac数据库引擎。datasnap也不再基于COM(COM势微)。
带来了全新的firedac内存表TFDMemTable。
最大的缺陷:只能使用firedac,不能支持ado,bde,dbx,unidac。。其他数据库引擎。
uses FireDAC.Stan.StorageBin, FireDAC.Stan.Intf;
2.1)查询
qry.Close; qry.SQL.Clear; qry.SQL.Text := 'select * from table'; db.qry.Open; TMemoryStream(ms).Clear; qry.SaveToStream(ms, sfBinary);
2.2)保存
服务端
qry.Close; qry.SQL.Clear; qry.SQL.Text := 'select from table where 1=2'; qry.LoadFromStream(ms, sfBinary); err := qry.ApplyUpdates; if err > 0 then begin //保存失败 end;
客户端
TFDMemTable.CachedUpdates := True; //此属性必须设置 TFDMemTable.ResourceOptions.StoreItems := TFDMemTable.ResourceOptions.StoreItems - [siData, siVisible]; //只提交修改的数据 //保存失败 TFDMemTable.CancelUpdates; TFDMemTable.ResourceOptions.StoreItems := TFDMemTable.ResourceOptions.StoreItems + [siData, siVisible]; //保存成功 TFDMemTable.MergeChangeLog;
本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/18588108