在维护COM+结构的三层结构的软件时,如果在服务端使用adoquery 查询后由 DSP 打包再传到客户端。
这种方式,效率很低,,通常查询结果,是不再需要 apply 到服务器的。
所以,我自己采用的方式,是在服务器端用 adoquery 查询,然后直接将 ADO结果直接传到客户端(不再经过DSP),然后再在客户端使用 adoquery 来接收数据;这样数据高效。
但是在客户端直接使用datasource 去连接 adouqery ,再使用 dbgrideh 来显示数据,在使用 dbgrideh 的数据排序就不能简单的使用ehlib 提供的简单的排序功能;
因为客户端的adoquery组件是没有设置 connection 及 connectioinstring 属性。所以,会出错错误;
所以,客户端的结构改为:
服务器 adoqery -> 客户 adoquery + dsp + clientdataset + dbgrideh 。
由于 clientdataset 是一个很优秀的数据集,但是仍然有些问题,所以我使用了 wwclientdataset 组件。
就算这样,仍然不能简单的使用Ehlib简单的排序功能,所以要自己写代码去支持它;
procedure TDM.PubP_OnTitleBtnClick(Sender: TObject; ACol: Integer;
Column: TColumnEh;C:TwwClientDataSet);
var
OldIndex,NewIndex: string;
begin
C.DisableControls;
OldIndex:= C.IndexName;
NewIndex:= Column.FieldName;
if OldIndex <> '' then begin
C.IndexName:= '';
C.DeleteIndex(OldIndex);
end;
case Column.Title.SortMarker of
smNoneEh, smDownEh:
begin
C.AddIndex('px', NewIndex, [ixPrimary]);
Column.Title.SortMarker:= smDownEh;
end;
smUpEh :
begin
C.AddIndex('px', NewIndex, [ixDescending]);
Column.Title.SortMarker:= smUpEh;
end;
end;
C.IndexName:= 'px';
C.First;
C.EnableControls;
end;
调用:
在 DBGRIDEH的 onTitleBtnClick 中写代码
dm.PubP_OnTitleBtnClick(Sender,ACol,Column ,CDS_QueryPOSat);