我对 TADOQuery、TADOCommand 或 TADODataSet 的查询执行超时设置有疑问(我已经对每一个都进行了尝试)。我有一个小型应用程序,它连接到数据库并定期执行存储过程,该过程返回数据集作为结果。
我的目标是保持此应用程序始终在线,但我的问题是,当连接丢失时,刚刚执行的命令(通过上述组件之一)的超时时间默认为 30 秒。我一直在寻找解决方案,但没有任何效果。您能给我一个建议,如何设置 CommandTimeout 例如到 5 秒或更佳,请说明如何修改 ADODB.pas 以尊重我自己的超时?
为此有很多“解决方案”,例如 set DataComponent.Connection.CommandTimeout := 1;但实际上,没有任何作用。我正在使用 D2009、MSSQL2005,并且连接和数据组件是在线程中动态创建的。
最后,我尝试过的是这个
// protected variable owned and created in the thread with its own connection
var Query_Object: TADODataSet;
// connection timeout is set to 3 seconds
Query_Object.Connection.ConnectionTimeout := 3;
...
// this piece of code I'm calling periodically in the only one existing thread
...
SQL_Query := 'EXEC my_procedure_which_returns_dataset'
with Query_Object do
begin
Close;
CommandType := cmdText;
CommandText := SQL_Query;
CommandTimeout := 5; // doesn't affect the timeout
CursorLocation := clUseServer; // let the dataset retreives prepared data
Open;
end;
// and here I need to get faster than in the default 15 seconds to let the user
// know that the reading takes more than mentioned 5 seconds
...
多谢 :)
CommandTimeout
当您有长时间运行的查询时就会启动。有一个CommandTimeout
的财产TADOConnection
但这不起作用。你必须使用CommandTimeout
of the TADODataSet
反而。
如果服务器不可用,您的问题显示“连接丢失”,您需要指定ConnectionTimeout
of the TADOConnection
成分。默认为 15 秒后控制权返回到您的应用程序。
Edit 1我想我发现了 CommandTimeout 不起作用的情况。我已经在一张非常大的桌子上对此进行了测试。返回所有行需要几分钟时间。如果我的存储过程是select * from BigTable
查询超时永远不会发生。至少我没有足够的耐心等待它结束。但如果查询看起来像这样select * from BigTable order by Col1
并且没有索引Col1
,CommandTimout 按预期工作。
在 SSMS 中运行这两个查询时,它们之间的差异很明显。第一个开始立即返回行,第二个需要在返回行之前“考虑”它。当 SQL Server 找到它需要的行并开始返回它们时,CommandTimeout 不起作用。
如果你设置CursorLocation
to clUseServer
the CommandTimeout
对于两个查询都将按预期工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)