主/明细数据集的请求太多

问题描述 投票:0回答:1

我们在主/明细关系中使用ADO数据集的Delphi应用程序。它们连接到位于另一台服务器上的SQL Server数据库。

由于许多详细数据集在打开时所产生的SQL请求数量较多,因此应用程序在网络连接速度较慢时会很慢。有没有办法批量生成所有细节数据集请求?

或者除了ADO之外还有一个可以更好地处理这种情况的数据集吗?

delphi dataset ado
1个回答
1
投票

我这样做了一段时间,因此我不再能够访问我用来对其进行基准测试的数据,但面对类似的情况,以下速度比标准主/细节有了很大的提升,而且工作量非常小。 Ymmv,当然。

在服务器上定义存储过程以检索所有详细数据集的所有行,如下所示

create procedure GetDetails(@MasterID int) as
begin
  select * from Details1 where MasterID = @MasterID 
  select * from Details2 where MasterID = @MasterID 
  /* etc */
end

在客户端中,设置一个数据模块,该数据模块具有AdoStoredProc,该AdoStoredProc调用存储过程以及与详细信息表一样多的AdoDatasets。

要检索Detail数据集的行,请使用这样的代码

var
  Rows : Integer;
[...]
spGetDetails.Parameters.ParamByName('@MasterID').Value := MasterID;
spGetDetails.Active := True;

Details1.RecordSet := spGetDetails.RecordSet;
Details1.Active ;= True;

Details2.RecordSet := spGetDetails.NextRecordSet(Rows);
Details2.Active ;= True;

Details3.RecordSet := spGetDetails.NextRecordSet(Rows);
Details3.Active ;= True;
  //  etc, you get the idea

当然,Details1..N AdoDataSets可以连接到标准的db-aware编辑控件或服务器作为一组TClientDataSets的提供者。

顺便说一句,这在数据模块处于3层设置的中间层的情况下工作得特别好,因为我可以将压缩流中的所有细节行打包,然后将dm发送到客户端。

更新以这种方式获取Details表的行似乎可以正常编辑它们以及查看它们,我无法立即看到为什么Details表不支持插入和删除。每个细节ADODatase都需要像通常那样配置为M-> D的细节,并使用CommandText,例如'select * from Detailx,其中MasterID = MasterID`。

© www.soinside.com 2019 - 2024. All rights reserved.