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

时间:2018-03-02 10:38:36

标签: delphi dataset ado

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

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

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

1 个答案:

答案 0 :(得分: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发送给客户端。

更新以这种方式获取详细信息表的行似乎可以正常编辑它们以及查看它们,我无法立即看到为什么详细信息表不会出现这种情况。 t支持插入和删除。每个细节ADODatase都需要像通常那样配置为M-> D的细节一侧,CommandText喜欢' select * from Detailx,其中MasterID = MasterID`。