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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主/明细数据集的请求太多相关的知识,希望对你有一定的参考价值。

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

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

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

答案

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

以上是关于主/明细数据集的请求太多的主要内容,如果未能解决你的问题,请参考以下文章

发明者量化商品期货合约代码明细

发明者量化商品期货合约代码明细

主明细应用,传递对象

ASP.NET WebAPI和带有大型数据集的jQuery(json)

iOS核心数据连接2x主明细表

使用存储过程将批量数据插入主/明细表的最佳方法?