ADO components CommandTimeout

后端 未结 3 1567
后悔当初
后悔当初 2021-01-12 13:26

I have a problem with settings of the query execution timeout with TADOQuery, TADOCommand or TADODataSet (I\'ve tried it with each one). I have a tiny application, which con

相关标签:
3条回答
  • 2021-01-12 13:54

    CommandTimeout is kicking in when you have long running queries. There is a CommandTimeout property of TADOConnection but that does not work. You have to use the CommandTimeout of the TADODataSet instead.

    If the server is unavailable, your question says "connection is lost", you need to specify ConnectionTimeout of the TADOConnection component. Default is 15 seconds before control is returned to your application.

    Edit 1 I think I have discovered a situation where CommandTimeout does not work. I have tested this against a really big table. It takes several minutes to return all rows. If my stored procedure does select * from BigTable the query timeout never happens. At least I was not patient enough to wait it out. But if the query looks like this select * from BigTable order by Col1 and there is no index on Col1, the CommandTimout works as expected.

    The difference between the two queries is obvious when running them in SSMS. The first starts to immediately return rows and the second needs to "think" about it before it returns rows. When SQL Server have found the rows it needs and start to return them, CommandTimeout does not work.

    If you set CursorLocation to clUseServer the CommandTimeout will work as expected for both queries.

    0 讨论(0)
  • 2021-01-12 14:13

    I've always used the following code to set the CommandTimeout value on a TADOQuery. If you adjust the class name it should also work with the others as well.

    type 
    TADOQueryHack = class(TADOQuery);
    
    ...
    
    TADOQueryHack(Qry).CommandTimeout := COMM_TIMEOUT;
    
    0 讨论(0)
  • 2021-01-12 14:15

    Following is what we use to set the timeout to 300 for our long running reports.

      //***** Fix setting CommandTimeOut. 
      //      CommandTimeOut "should" get the timeout value from its connection. 
      //      This is not supported in ADODB (using Delphi5)
      TADODataSet(qryReport).CommandTimeout := ADOConnection.CommandTimeout;
    

    Edit

    Executing following piece of code on my Development Machine times out after 1 second.

    • The query has a connectionstring to our SQLServer production database.
    • The script (tries to) runs for 10 seconds
    • After one second, I get a TimeOut exception

    Test

    procedure TForm1.btn1Click(Sender: TObject);
    const
      SSQL: string =
        'DECLARE    @intLoop int '#13#10
        + 'SET @intLoop = 10 '#13#10
        + 'WHILE @intLoop > 1 '#13#10
        + 'BEGIN '#13#10
        + ' SELECT  @intLoop, GetDate() '#13#10
        + ' WAITFOR DELAY ''00:00:01'' '#13#10
        + ' SELECT  @intLoop = @intLoop -1 '#13#10
        + 'END ';
    begin
      qry1.SQL.Text := SSQL;
      TADODataSet(qry1).CommandTimeout := 1;
      qry1.ExecSQL;
    end;
    
    0 讨论(0)
提交回复
热议问题