主/明细数据集的请求太多
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`。
以上是关于主/明细数据集的请求太多的主要内容,如果未能解决你的问题,请参考以下文章