2011-11-02 8 views
8

Quando si esegue una query nell'applicazione Web, viene visualizzato il valore null. La stessa query direttamente in SQL Management Studio restituisce risultati.Come aumentare il tempo in web.config per l'esecuzione della query sql

Penso che il problema sia un timeout. Come posso aumentare il tempo di esecuzione della query nell'applicazione web? Nel mio web.config: connectionstring, non esiste alcun codice per il timeout. Se scelgo un timeout, ciò influirà su altre parti del mio sistema?

+1

Esso non può essere controllato in base alla configurazione. Impostare CommandTimeout di SqlCommand. Per ulteriori informazioni sulle impostazioni di timeout della richiesta di pagina, consultare il post http://stackoverflow.com/questions/7804622/how-to-upload-content-more-than-2-mbs-on-website-created-using-asp-net -4-0/7804670 # 7804670 – Prasanth

+1

Come fai a saperlo a causa del timeout? Prova a usare Sql Profiler e vedi quale query si sta formando. Vedi altri dettagli come la durata, letture, ecc. Estrarre la query da profiler e quindi eseguire, quella query in SQL Server. –

+0

Iam utilizza lo studio di gestione SQL del server SQL. C'è un profiler. Non so come usarlo? –

risposta

4

È necessario aggiungere il blocco httpRuntime e gestire executionTimeout (in secondi).

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
... 
<system.web> 
    <httpRuntime executionTimeout="90" maxRequestLength="4096" 
    useFullyQualifiedRedirectUrl="false" 
    minFreeThreads="8" 
    minLocalRequestFreeThreads="4" 
    appRequestQueueLimit="100" /> 
</system.web> 
... 
</configuration> 

Per ulteriori informazioni, si prega di vedere msdn page.

+1

Questo è il timeout per l'esecuzione della pagina ASP.NET stessa, non per la query SQL. – Abel

+1

Il timeout di esecuzione di httpRuntime dovrebbe essere almeno lungo quanto il timeout di esecuzione della query se si sta eseguendo la query come parte di una richiesta, altrimenti la richiesta verrà interrotta e cancellata prima che la query possa essere completata. – Triynko

1

Penso che non sia possibile aumentare il tempo per l'esecuzione della query, ma è necessario aumentare il timeout per la richiesta.

Execution Timeout Specifies the maximum number of seconds that a request is allowed to execute before being automatically shut down by ASP.NET. (Default time is 110 seconds.)

Per Dettagli, si prega di dare un'occhiata alla https://msdn.microsoft.com/en-us/library/e1f13641%28v=vs.100%29.aspx

Si può fare nel web.config. per esempio

<httpRuntime maxRequestLength="2097152" executionTimeout="600" /> 
3

SQL Server non ha alcuna impostazione per controllare timeout di query nella stringa di connessione, e per quanto so che questo è lo stesso per altri database principali. Ma, questo non sembra il problema che stai vedendo: mi aspetto di vedere un'eccezione sollevata

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

se ci fosse davvero un timeout di eseguire la query.

Se questo risulta essere un problema, è possibile modificare il timeout predefinito per un database SQL Server come proprietà del database stesso; utilizzare SQL Server Manager per questo.

Assicurarsi che la query sia esattamente uguale alla tua applicazione Web come quella che stai eseguendo direttamente. Usa un profiler per verificarlo.

9

Si può fare una cosa.

  1. In AppSettings.config (creane uno se non esiste), crea una coppia di valori chiave.
  2. Nel codice, tirare il valore e convertirlo in Int32 e assegnarlo al comando.TimeOut.

come: - In appsettings.config ->

<appSettings>  
    <add key="SqlCommandTimeOut" value="240"/> 
</appSettings> 

In Code ->

command.CommandTimeout = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SqlCommandTimeOut"]); 

Che dovrebbe farlo.

Nota: - Ho affrontato la maggior parte dei problemi di timeout quando ho usato la classe SqlHelper dai blocchi di applicazioni Microsoft. Se lo hai nel tuo codice e stai affrontando problemi di timeout è meglio usare sqlcommand e impostare il suo timeout come descritto sopra. Per tutti gli altri scenari, sqlhelper dovrebbe funzionare correttamente.Se il tuo cliente sta bene aspettando un po 'più di quello che offre la classe sqlhelper, puoi andare avanti e usare la tecnica di cui sopra.

esempio: - Utilizzare questo -

SqlCommand cmd = new SqlCommand(completequery); 

cmd.CommandTimeout = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SqlCommandTimeOut"]); 

SqlConnection con = new SqlConnection(sqlConnectionString); 
SqlDataAdapter adapter = new SqlDataAdapter(); 
con.Open(); 
adapter.SelectCommand = new SqlCommand(completequery, con); 
adapter.Fill(ds); 
con.Close(); 

Invece di

DataSet ds = new DataSet(); 
ds = SqlHelper.ExecuteDataset(sqlConnectionString, CommandType.Text, completequery); 

Update: Vedere anche @Triynko risposta qui sotto. È importante controllare anche questo.

+0

Questo ti aiuterà a cambiare il valore quando vuoi. Ma se stai pianificando enormi quantità di dati, ti suggerisco di fare ulteriori analisi sulla natura degli affari e su come i dati potrebbero accumularsi, e quindi pianificare il tuo progetto Db. Poiché il timeout richiesto può aumentare con l'aumento del numero di record e complessità coinvolti. Si prega di scartare questo commento se si dispone già di un DB creato o non autorizzato all'architetto. –

0

Mi rendo conto che sono un po 'in ritardo rispetto al gioco, ma ho trascorso solo un giorno cercando di cambiare il timeout di un servizio web. Sembrava avere un timeout predefinito di 30 secondi. Io dopo aver cambiato evry altro valore di timeout sono riuscito a trovare, tra cui:

  • DB stringa di connessione Connect Timeout
  • httpRuntime executionTimeout
  • basicHttpBinding vincolante CloseTimeout
  • basicHttpBinding vincolante vincolante sendTimeout
  • basicHttpBinding ReceiveTimeout
  • basicHttpBinding binding openTimeout

Finaley Ho trovato che era il timeout SqlCommand che era predefinito per 30 secondi.

Ho deciso di duplicare il timeout della stringa di connessione al comando. La stringa di connessione è configurata in web.config.

Alcuni codice:

namespace ROS.WebService.Common 
{ 
    using System; 
    using System.Configuration; 
    using System.Data; 
    using System.Data.SqlClient; 

    public static class DataAccess 
    { 
    public static string ConnectionString { get; private set; } 

    static DataAccess() 
    { 
     ConnectionString = ConfigurationManager.ConnectionStrings["ROSdb"].ConnectionString; 
    } 

    public static int ExecuteNonQuery(string cmdText, CommandType cmdType, params SqlParameter[] sqlParams) 
    { 
     using (SqlConnection conn = new SqlConnection(DataAccess.ConnectionString)) 
     { 
     using (SqlCommand cmd = new SqlCommand(cmdText, conn) { CommandType = cmdType, CommandTimeout = conn.ConnectionTimeout }) 
     { 
      foreach (var p in sqlParams) cmd.Parameters.Add(p); 
      cmd.Connection.Open(); 
      return cmd.ExecuteNonQuery(); 
     } 
     } 
    } 
    } 
} 

modifica introdotta a "duplicare" il valore di timeout dalla stringa di connessione: CommandTimeout = conn.ConnectionTimeout

Problemi correlati