Master/Detail 数据集请求过多
Master/Detail datasets too many requests
我们有一个 Delphi 应用程序在 Master/Detail 关系中使用 ADO 数据集。这些连接到位于另一台服务器上的 SQL 服务器数据库。
由于打开时许多详细数据集发出的 SQL 请求量很大,该应用程序在慢速网络连接上运行缓慢。有没有办法批量发出所有详细数据集请求?
或者除了 ADO 之外还有其他数据集可以更好地处理这种情况吗?
我已经有一段时间没有这样做了,所以我无法再访问我用来对其进行基准测试的数据,但面对类似的情况,下面的速度比标准有巨大的提升 Master/Details ,非常少的努力。 Ymmv,当然。
在服务器上定义一个存储过程来像这样检索所有详细数据集的所有行
create procedure GetDetails(@MasterID int) as
begin
select * from Details1 where MasterID = @MasterID
select * from Details2 where MasterID = @MasterID
/* etc */
end
在客户端中,设置一个数据模块,它有一个调用存储过程的 AdoStoredProc 和与详细信息表一样多的 AdoDataset。
要检索 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 将其发送给客户端。
Update 以这种方式获取 Details 表的行似乎可以很好地编辑它们以及查看它们,但我不能立即明白为什么 Details 表会' 支持插入和删除。每个细节 ADODatasets 都需要像通常对 M->D 的细节端那样进行配置,使用 CommandText
像 'select * from Detailx where MasterID = MasterID`.
我们有一个 Delphi 应用程序在 Master/Detail 关系中使用 ADO 数据集。这些连接到位于另一台服务器上的 SQL 服务器数据库。
由于打开时许多详细数据集发出的 SQL 请求量很大,该应用程序在慢速网络连接上运行缓慢。有没有办法批量发出所有详细数据集请求?
或者除了 ADO 之外还有其他数据集可以更好地处理这种情况吗?
我已经有一段时间没有这样做了,所以我无法再访问我用来对其进行基准测试的数据,但面对类似的情况,下面的速度比标准有巨大的提升 Master/Details ,非常少的努力。 Ymmv,当然。
在服务器上定义一个存储过程来像这样检索所有详细数据集的所有行
create procedure GetDetails(@MasterID int) as
begin
select * from Details1 where MasterID = @MasterID
select * from Details2 where MasterID = @MasterID
/* etc */
end
在客户端中,设置一个数据模块,它有一个调用存储过程的 AdoStoredProc 和与详细信息表一样多的 AdoDataset。
要检索 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 将其发送给客户端。
Update 以这种方式获取 Details 表的行似乎可以很好地编辑它们以及查看它们,但我不能立即明白为什么 Details 表会' 支持插入和删除。每个细节 ADODatasets 都需要像通常对 M->D 的细节端那样进行配置,使用 CommandText
像 'select * from Detailx where MasterID = MasterID`.