2011-11-02 9 views
8

Cuando estoy ejecutando una consulta en la aplicación web, obtengo un valor de null. La misma consulta directamente en SQL Management Studio devuelve resultados.Cómo aumentar el tiempo en web.config para ejecutar la consulta sql

Creo que el problema es un tiempo de espera. ¿Cómo puedo aumentar el tiempo de ejecución de la consulta en la aplicación web? En mi web.config: connectionstring, no hay código para el tiempo de espera. Si elijo un tiempo de espera allí, ¿afectará eso a otras partes de mi sistema?

+1

No puede ser controlado por la configuración. Establezca CommandTimeout de SqlCommand. Para obtener más información sobre la configuración de tiempo de espera de solicitud de página, consulte la publicación 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

¿Cómo lo sabe debido al tiempo de espera? Intente utilizar Sql Profiler y vea qué consulta se está formando. Vea otros detalles como la duración, lecturas, etc. Extraiga la consulta del generador de perfiles y luego ejecute esa consulta en el servidor Sql. –

+0

Iam usando SQL Server 2005 Management Studio. ¿Dónde está el perfil? ¿No sé cómo usarlo? –

Respuesta

4

Debe agregar el bloque httpRuntime y ocuparse de executionTimeout (en segundos).

<?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> 

Para obtener más información, por favor, vea msdn page.

+1

Este es el tiempo de espera para la ejecución de la página ASP.NET en sí, no para la consulta SQL. – Abel

+1

El httpRuntime executionTimeout debe ser probablemente tan largo como el tiempo de espera de ejecución de la consulta si está ejecutando la consulta como parte de una solicitud, de lo contrario la solicitud se cancelará y se cancelará antes de que la consulta tenga la oportunidad de completarse. – Triynko

1

Creo que no puede aumentar el tiempo de ejecución de la consulta, pero necesita aumentar el tiempo de espera para la solicitud.

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.)

Para más detalles, por favor, echar un vistazo a https://msdn.microsoft.com/en-us/library/e1f13641%28v=vs.100%29.aspx

Se puede hacer en el web.config. por ejemplo

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

SQL Server no tiene ninguna configuración para controlar el tiempo de espera de consulta en la cadena de conexión, y por lo que sé que esto es lo mismo para otras bases de datos principales. Sin embargo, esto no se ve como el problema que se está viendo: Yo esperaría a ver una excepción elevó

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

si había realmente un tiempo de espera de la ejecución de la consulta.

Si esto resulta ser un problema, puede cambiar el tiempo de espera predeterminado para una base de datos de SQL Server como una propiedad de la base de datos; use el Administrador del Servidor SQL para esto.

Asegúrese de que la consulta sea exactamente lo mismo desde su aplicación web que la que está ejecutando directamente. Use un perfilador para verificar esto.

9

Puede hacer una cosa.

  1. En AppSettings.config (cree uno si no existe), cree un par de valores clave.
  2. En el código, extraiga el valor y conviértalo en Int32 y asígnelo al comando.TimeOut.

como: - En appSettings.config ->

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

En Código ->

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

Eso debería hacerlo.

Nota: - Me enfrenté a la mayoría de los problemas de tiempo de espera cuando utilicé la clase SqlHelper de los bloques de aplicaciones de Microsoft. Si lo tiene en su código y tiene problemas de tiempo de espera, es mejor que use sqlcommand y configure su tiempo de espera como se describe arriba. Para todos los demás escenarios, sqlhelper debería estar bien.Si su cliente está de acuerdo con esperar un poco más de lo que le ofrece la clase sqlhelper, puede continuar y utilizar la técnica anterior.

ejemplo: - Utilice esta -

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(); 

En lugar de

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

Actualización: También consulte @Triynko responder a continuación. Es importante verificar eso también.

+0

Esto le ayudará a cambiar el valor siempre que lo desee. Pero si está planificando una gran cantidad de datos, le sugiero que haga más análisis sobre la naturaleza del negocio y cómo se pueden acumular los datos, y luego planifique su diseño de Db. Como el tiempo de espera requerido puede aumentar a medida que aumenta el número de registros y la complejidad involucrada. Descarte este comentario si ya tiene una base de datos creada o no autorizada. –

0

Me doy cuenta de que estoy un poco retrasado en el juego, pero solo dediqué más de un día a intentar cambiar el tiempo de espera de un servicio web. Parecía tener un tiempo de espera predeterminado de 30 segundos. Yo después de cambiar Evry otro valor de tiempo de espera que pude encontrar, incluyendo:

  • DB cadena de conexión Conexión Tiempo de espera
  • httpRuntime executionTimeout
  • basicHttpBinding vinculante CloseTimeout
  • basicHttpBinding vinculante SendTimeout
  • basicHttpBinding vinculante ReceiveTimeout
  • basicHttpBinding binding openTimeout

Finaley Descubrí que era el tiempo de espera de SqlCommand el valor predeterminado de 30 segundos.

Decidí simplemente duplicar el tiempo de espera de la cadena de conexión para el comando. La cadena de conexión está configurada en web.config.

Algunos código:

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(); 
     } 
     } 
    } 
    } 
} 

cambio introducido a "duplicar" el valor de tiempo de espera de la cadena de conexión: CommandTimeout = conn.ConnectionTimeout

Cuestiones relacionadas