gpt4 book ai didi

delphi - 为什么主记录更改时不发生 TADOQuery AfterOpen 事件?

转载 作者:行者123 更新时间:2023-12-03 15:20:55 26 4
gpt4 key购买 nike

假设我们有一个带有两个 TADOQuery 的标准主从关系。当在主数据集上进行导航时,详细数据集不会出现 AfterOpen 事件。

此事件在其他数据访问包(例如 BDE)中出现。为什么 dbGo 的行为有所不同?

.dfm 的一部分:

  object DataSource1: TDataSource
DataSet = SDQuery1
Left = 504
Top = 72
end
object DataSource2: TDataSource
DataSet = SDQuery2
Left = 520
Top = 360
end
object ADOConnection1: TADOConnection
LoginPrompt = False
Left = 336
Top = 464
end
object ADOQuery1: TADOQuery
Connection = ADOConnection1
Parameters = <>
Left = 504
Top = 160
end
object ADOQuery2: TADOQuery
Connection = ADOConnection1
AfterOpen = ADOQuery2AfterOpen // <- rised when dataset was opened at first time only
DataSource = DataSource1
Parameters = <>
Left = 520
Top = 296
end

最佳答案

Delphi ADO 组件行为的原因是,当主数据集滚动,ADODB.Pas 中的代码执行

  procedure TCustomADODataSet.MasterChanged(Sender: TObject);
begin
if not Active then Exit;
if Parameters.Count = 0 then
begin
CheckBrowseMode;
if SetDetailFilter then First;
end else
RefreshParams;
end;

并且SetDetailFilterRefreshParams都不涉及关闭和重新打开详细数据集。 Requery 最终调用

  procedure TCustomADODataSet.InternalRequery(Options: TExecuteOptions = []);
begin
if FConnectionChanged then
DatabaseError(SCantRequery);
try
Recordset.Requery(ExecuteOptionsToOrd(Options));
except
if Recordset.State = adStateClosed then Close;
raise;
end;
DestroyLookupCursor;
end;

它使用 ADO RecordSet 对象的特定功能(也称为Requery)在 TCustomADODataSet 底层检索匹配的详细记录,效率显着提高而不是关闭并重新打开详细数据集,这就是不调用其 AfterOpen 事件的原因。

另请参阅 DB.Pas 中定义的 TDetailDatalinkTMasterDatalink

关于delphi - 为什么主记录更改时不发生 TADOQuery AfterOpen 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55401730/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com