到這里 Delphi 10.4.2 。一個 ADOConnection 和一個 ADOQuery 。
ADOConnection 使用 OleDB (UDL) 連接到 MSSQL。我已經離開了 CommandTimeout 30 。現在我將 ADOQuery 放在這個表單上,將它的 Connection 屬性設定為 ADOConnection 。所有其他值均為默認值,CommandTimeout 為 30。
現在讓我們想象一下我們有一個非常大的超時表。使用默認 30 秒 。
我的問題是:
如果我將 ADOQuery CommandTimeout 設定為 600 它可以作業但是如果我只將 ADOConnection CommandTimeout 設定為 600 它仍然會超時
如果 ADOConnection 上的 CommandTimeout 不是簡單地將它的值傳播到它的關聯組件(當然直到我覆寫它們),它有什么目的?
謝謝你。
編輯 1:
ADOConnection CommandTimeout 是否實際上用于某些 ADOConnection 必須執行以建立連接的后臺任務?例如,如果我在 IDE 中激活它,然后有一個 ADOStoredProcedure 并且我想列出它使用此超時的服務器上所有可用的存盤程序?
uj5u.com熱心網友回復:
根據微軟的說法,每個 ADO 物件都尊重自己的CommandTimeout:
Connection 物件上的 CommandTimeout 設定對同一 Connection 上的 Command 物件上的 CommandTimeout 設定沒有影響;也就是說,Command 物件的 CommandTimeout 屬性不繼承 Connection 物件的 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 Timeout
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/340214.html
上一篇:如何轉義加速器字符?[復制]
