7 delphi timeout ado tadodataset tadoquery
我有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
...
Run Code Online (Sandbox Code Playgroud)
非常感谢 :)
CommandTimeout当你有长时间运行的查询时,它正在开始.有一个但不起作用的CommandTimeout财产TADOConnection.你必须使用CommandTimeout的TADODataSet替代.
如果服务器不可用,你的问题说:"连接丢失",则需要指定ConnectionTimeout的的TADOConnection组成部分.在将控制权返回给您的应用程序之前,默认值为15秒.
编辑1我想我发现了CommandTimeout不起作用的情况.我已经在一张非常大的桌子上测试了这个.返回所有行需要几分钟.如果我的存储过程执行select * from BigTable查询超时永远不会发生.至少我没耐心等待它.但是如果查询看起来像这样select * from BigTable order by Col1并且没有索引Col1,则CommandTimout按预期工作.
在SSMS中运行它们时,两个查询之间的区别是显而易见的.第一个开始立即返回行,第二个需要在返回行之前"思考"它.当SQL Server找到所需的行并开始返回它们时,CommandTimeout不起作用.
如果设置CursorLocation到clUseServer了CommandTimeout可以发挥预期的两个查询.