我们有一个巨大的 Delphi 2005 应用程序,其中包含大量 ADO 组件(TADODataset、TADOStoredPROc、TADOCommand...),分布在数百个表单上。它们全部连接到单个 TADOConnection。
这些组件中的大多数将其 CommandTimeout 属性设置为默认值(30 秒),但少数将其设置为 5 分钟(300 秒),还有一些设置为永不超时(0 秒)。
我希望能够在应用程序范围内全局更改所有 ADO 组件的此设置。我更喜欢在运行时以编程方式执行此操作,以便在需要时可以在每次安装的基础上调整超时。
我希望在创建/附加 ADO 组件时能够在连接上找到一个全局事件,我可以在其中调整命令超时,或者破解我的方式将代码注入(inject)到组件本身中,但结果是空白。
我不想创建后代,因为我必须搜索/替换所有组件,并且如果我忘记使用后代而不是常规 ADO 组件,我的超时将不会遵循应用程序的其余部分。
有人知道我们如何做到这一点吗?
最佳答案
如果所有 ADO 组件都放置在窗体上,则可以使用 Screen.Forms 和 Screen.FormCount 属性迭代所有窗体。对于每个表单,迭代其 ComponentCount/Components 属性并检查 TADOCommand、TADODataSet、TADOQuery、TADOStoredProc 和 TADOTable。然后您可以根据需要设置超时时间。当然,如果您动态创建表单,则必须单独考虑这一点。
以下代码可能会指导您。
procedure SetADOTimeout(ATimeout: Integer);
var
cmp: TComponent;
frm: TForm;
I: Integer;
J: Integer;
begin
for I := 0 to Screen.FormCount - 1 do begin
frm := Screen.Forms[I];
for J := 0 to frm.ComponentCount - 1 do begin
cmp := frm.Components[J];
if cmp is TADOCommand then
TADOCommand(cmp).CommandTimeout := ATimeout
else if cmp is TADODataSet then
TADODataSet(cmp).CommandTimeout := ATimeout
else if cmp is TADOQuery then
TADOQuery(cmp).CommandTimeout := ATimeout
else if cmp is TADOStoredProc then
TADOStoredProc(cmp).CommandTimeout := ATimeout
else if cmp is TADOTable then
TADOTable(cmp).CommandTimeout := ATimeout;
end;
end;
end;
关于德尔福: Globally change ADO command timeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7472328/