2009-05-08 14 views
9
Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 

Source Error: 

Line 91: 
Line 92:    DataSet getData; 
Line 93:    getData = SqlHelper.ExecuteDataset(ConfigurationManager.ConnectionStrings["connstr"].ConnectionString, CommandType.StoredProcedure, "Course_NewReportGet_Get_Sav", objPara); 
Line 94: 
Line 95:    foreach (DataRow dr in getData.Tables[0].Rows) 


Source File: c:\Users\Ryan\bancroft archive\santiago\santiago code\trunk\admin\tools\Optimus.aspx.cs Line: 93 

Stack Trace: 

[SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.] 
    System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +1950890 
    System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +4846875 
    System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +194 
    System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2392 
    System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +33 
    System.Data.SqlClient.SqlDataReader.get_MetaData() +83 
    System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +297 
    System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +954 
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162 
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32 
    System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141 
    System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12 
    System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +10 
    System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +130 
    System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +287 
    System.Data.Common.DbDataAdapter.Fill(DataSet dataSet) +94 
    Mexico.Data.SqlHelper.ExecuteDataset(SqlConnection connection, CommandType commandType, String commandText, SqlParameter[] commandParameters) +149 
    Mexico.Data.SqlHelper.ExecuteDataset(String connectionString, CommandType commandType, String commandText, SqlParameter[] commandParameters) +93 
    admin_tools_Optimus.GetUsers() in c:\Users\Ryan\bancroft archive\santiago\santiago code\trunk\admin\tools\Optimus.aspx.cs:93 
    admin_tools_Optimus.GetCompanies() in c:\Users\Ryan\bancroft archive\santiago\santiago code\trunk\admin\tools\Optimus.aspx.cs:75 
    admin_tools_Optimus.Proceed(Object sender, EventArgs e) in c:\Users\Ryan\bancroft archive\santiago\santiago code\trunk\admin\tools\Optimus.aspx.cs:43 
    System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111 
    System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110 
    System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10 
    System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 
    System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565 
+2

Proprietà ConnectionTimeout è di sola lettura. –

risposta

14

Forse questo non si applica, ma penso che dovrebbe essere menzionato comunque. CommandTimeOut predefinito è 30 secondi. Questo dovrebbe essere un sacco di tempo per qualsiasi azione che sta accadendo nel 99,9% di un'applicazione web. A meno che tu non sia assolutamente sicuro che l'azione debba richiedere più tempo, dovresti passare il tuo tempo a cercare di ottimizzare lo sql in modo che ritorni in < 30 secondi. L'indicizzazione corretta è un buon punto di partenza per questo.

+0

questo è in realtà un affare una tantum, sto provando a fare una massiccia conversione dei dati ma continua a cronometrare, anche dopo aver impostato il timeout a 5000 – BigOmega

+1

@Ryan: se si tratta di un accordo una tantum, usa il gestore sql per eseguire la query o le query. –

+11

Buona raccomandazione, ma sfortunatamente non risponde alla domanda dell'OP. Esistono numerosi casi in cui l'esecuzione di una query molto lunga su un DB è l'unica opzione possibile. Cambiando SqlCommand.CommandTimeout funzionerà in questo caso. –

1

È possibile eseguire questa operazione aggiungendo "Connect Timeout = 90" alla stringa di connessione. Se la tua query impiega più di 30 secondi, dovresti davvero prendere in considerazione l'ottimizzazione della query in qualche modo. Potrebbe essere necessario aggiungere gli indici o creare una vista, ecc.

Modificato per correggere il problema indicato dai commenti @Stijn.

+2

ConnectionTimeout è una proprietà di sola lettura. – Stijn

+1

aggiungendo un "timeout di connessione" alla stringa di connessione risolverà i problemi con la connessione al database e non i timeout durante l'esecuzione del comando SQL. Dovresti impostare SqlCommand.CommandTimeout per quello – dotnetguy

+0

@Stijn, j0tt ha ragione nel fatto che puoi benissimo impostare il timeout di connessione tramite la stringa di connessione. Guarda connectionstrings.com per gli esempi – dotnetguy

18

È possibile aumentare il periodo di timeout sul comando impostando la proprietà SqlCommand.CommandTimeout.

+0

So che questo è vecchio ma voglio un voto negativo (ma non posso a causa della mia bassa reputazione). Non può usare "SqlCommand.CommandTimeout" perché utilizza la classe SqlHelper di Microsoft.ApplicationBlocks.Data. – Dobermaxx99

3

+1 a Al perché 30 secondi dovrebbero essere abbondanti. Rendere il periodo di timeout più lungo è in realtà solo una benda al problema sottostante.

In base alla mia esperienza, il proc memorizzato è troppo costoso il 90% delle volte. Quando stavo rivedendo questi ultimi errori, avevo una regola generale che nessun processo memorizzato costava più di 1,00. Più sono costosi, maggiore è il rischio di bloccare e generare queste eccezioni.

+0

Come fai a sapere quali sono i criteri di prestazione per questa routine? Forse è un lavoro in background che fa molto in uno Stored proc –

+0

Quindi chiaramente questo consiglio non si applica. Caveat emptor. –

8

Poi inserirlo nella stringa di connessione:

server={servername};database={dbname};uid={username};pwd={password};Connect Timeout=600 
+0

L'OP non sta cercando di scoprire come aumentare il timeout del comando? Non puoi cambiarlo dalla stringa di [email protected] La risposta di Alioto è la più vicina a ciò che viene chiesto – dotnetguy

2

la query utilizzata non è stato ottimizzato per la quantità di dati. Nel nostro caso abbiamo cancellato i dati non utilizzati, ma un'opzione migliore dovrebbe essere l'ottimizzazione della query o per dare un'occhiata al servizio di pulizia. Dopo l'azione non abbiamo più ricevuto l'errore. Ovviamente dipende dalla situazione in cui ricevi questo errore e se questa soluzione ti aiuterà.

Problemi correlati