首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ADOConnection ADOQuery CommandTimeout,重写顺序(如果有的话)

ADOConnection ADOQuery CommandTimeout,重写顺序(如果有的话)
EN

Stack Overflow用户
提问于 2021-10-27 06:02:25
回答 1查看 240关注 0票数 1

来到这里德尔福10.4.2。一个ADOConnection和一个ADOQuery。

ADOConnection使用OleDB (UDL)连接到MSSQL。我已经离开了CommandTimeout 30。现在,我将ADOQuery放在此表单上,将其连接属性设置为ADOConnection。所有其他值都是默认的,CommandTimeout为30。

现在,让我们想象一下,我们有一个非常大的表,其中超时。默认的30秒。

我的问题是:

如果我将ADOQuery CommandTimeout设置为600,它会工作,但如果只将ADOConnection CommandTimeout设置为600,则仍然会导致超时。

如果CommandTimeout on ADOConnection不简单地将其值传播到它的相关组件(当然,直到我覆盖它们),那么它有什么用途呢?

谢谢。

编辑1 :

ADOConnection CommandTimeout实际上是用于ADOConnection构建连接必须执行的一些后台任务吗?例如,如果我在IDE中激活它,然后有一个ADOStoredProcedure,我想列出它使用这个超时的服务器上的所有可用存储过程?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-27 16:13:07

根据微软,每个ADO对象都尊重自己的CommandTimeout

连接对象上的CommandTimeout设置对同一连接上的命令对象的CommandTimeout设置没有影响;也就是说,命令对象的CommandTimeout属性不继承连接对象的CommandTimeout值的值。

我做了一个小的MRE (使用Delphi 10.3)来证明这一点:

代码语言:javascript
复制
program SO69733529;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  ActiveX,
  AdoDb,
  System.SysUtils;

procedure TestADOCommandTimeout;

var
  Conn : TADOConnection;
  Qry  : TADOQuery;
  SQLDelay : Integer;

begin
 Conn := TADOConnection.Create(nil);
 Qry := TADOQuery.Create(nil);
 try
  Conn.LoginPrompt := False;
  Conn.ConnectionString := 'Provider=SQLOLEDB.1;Data Source=localhost\sqlexpress;Initial Catalog=TestCustomer;Integrated Security = SSPI;';
  Conn.Connected := True;
  Qry.Connection := Conn;
  Writeln('Connected to DB');
  SQLDelay := 10;
  Conn.CommandTimeout := 5;
  try
   Writeln(Format('Waiting for %d seconds, connection timeout is %d seconds', [SQLDelay, Conn.CommandTimeout]));
   Conn.Execute(Format('WAITFOR DELAY ''00:00:%.2d''', [SQLDelay]));
   Writeln('No Timeout');
  except
   on E: Exception do
    Writeln(E.ClassName, ': ', E.Message);
  end;
  Qry.CommandTimeout := 30;
  try
   Writeln(Format('Waiting for %d seconds, query timeout is %d seconds, connection timeout is %d seconds', [SQLDelay, Qry.CommandTimeout, Conn.CommandTimeout]));
   Qry.SQL.Text := Format('WAITFOR DELAY ''00:00:%.2d''', [SQLDelay]);
   Qry.ExecSQL;
   Writeln('No Timeout');
  except
   on E: Exception do
    Writeln(E.ClassName, ': ', E.Message);
  end;
  // now redo the same test but with connection commandtimeout same as qry timeout
  Qry.CommandTimeout := 15;
  Conn.CommandTimeout := Qry.CommandTimeout;
  try
   Writeln(Format('Waiting for %d seconds, query timeout is %d seconds, connection timeout is %d seconds', [SQLDelay, Qry.CommandTimeout, Conn.CommandTimeout]));
   Qry.SQL.Text := Format('WAITFOR DELAY ''00:00:%.2d''', [SQLDelay]);
   Qry.ExecSQL;
   Writeln('No Timeout');
  except
   on E: Exception do
    Writeln(E.ClassName, ': ', E.Message);
  end;    
 finally
  Qry.Free;
  Conn.Free;
 end;
end;

begin
  try
   try
    CoInitialize(nil);
    TestADOCommandTimeout;
   finally
     CoUninitialize;
   end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
 Readln;
end.

输出:

代码语言:javascript
复制
 Connected to DB Waiting for 10 seconds, connection timeout is 5 seconds
 EOleException: Query timeout expired 
 Waiting for 10 seconds, query timeout is 30 seconds, connection timeout is 5 seconds  
 No Timeout 
 Waiting for 10 seconds, query timeout is 15 seconds, connection timeout is 15 seconds 
 No Timeout
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69733529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档