来到这里德尔福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,我想列出它使用这个超时的服务器上的所有可用存储过程?
发布于 2021-10-27 16:13:07
根据微软,每个ADO对象都尊重自己的CommandTimeout
连接对象上的CommandTimeout设置对同一连接上的命令对象的CommandTimeout设置没有影响;也就是说,命令对象的CommandTimeout属性不继承连接对象的CommandTimeout值的值。
我做了一个小的MRE (使用Delphi 10.3)来证明这一点:
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.输出:
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 Timeouthttps://stackoverflow.com/questions/69733529
复制相似问题