德尔福: Globally change ADO command timeout

标签 delphi timeout ado

我们有一个巨大的 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/

相关文章:

Delphi如何为新的ITextRange2类型接口(interface)导入类型库?

python - Discord.py 按钮响应交互在一定时间后失败

excel - VBA 记录集筛选器通配符 'Ending With' 不起作用 - 错误 3001

delphi - 如何自动将构建日期转换为代码可见的常量?

delphi - 如何解决这段代码中的字节顺序问题?

javascript - 在 JavaScript 中使用 if else 语句设置超时

mysql - 带有内部连接的 SQL 更新查询给出了超过锁定等待超时

sql-server - Excel 2007 表单到 SQL Server

Delphi/ADO : Which components? TADODataSet 和 TADOCommand 或 TADOQuery?

delphi - 如何在 TMenuOption 中显示希腊符号