2012-02-24 12 views
11

Estoy intentando cambiar el tiempo de espera para una consulta SqlCommand, en un método que prueba mi conexión para una cadena de conexión dada. El código es similar a esto:CommandTimeout no funciona

using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     SqlCommand cmd = new SqlCommand("SELECT ...", connection); 
     cmd.CommandTimeout = 10; 
     connection.Open(); 
     SqlDataReader reader = cmd.ExecuteReader(); 
     ... 
     connection.Close(); 
    } 

Me gustaría tener un corto tiempo de espera aquí, ya que sólo quiero probar si esta cadena de conexión está bien. Pero, sin importar el número que configuré en CommandTimeout (probé 0, 1, 2, 4, 10, 30, 60, 120), mi tiempo real obtenido para una cadena de conexión ficticia es siempre aproximadamente el mismo (tiempo de ejecución total de unos 15 segundos).

Por lo tanto, me parece que el valor que configuro en CommandTimeout se ignora por algún motivo.

¿Alguna idea de por qué?

+0

Ni idea, pero el mana de MSDN en http://msdn.microsoft.com/en-us/library/system. data.sqlclient.sqlcommand.commandtimeout.aspx indica un par de razones por las que podría ser ignorado. Una es el uso asincrónico y el uso de BeginExecuteReader, que no es su problema. Sin embargo, el otro se refiere al tiempo de espera "..no efecto cuando el comando se ejecuta contra una conexión de contexto (una SqlConnection abierta con" context connection = true "en la cadena de conexión)." Tal vez revise su cadena de conexión para ver si esta es la causa. –

+0

Sí, revisé la documentación un par de veces para asegurarme de que no me faltaba algo allí. De todos modos, no es un lector asíncrono ni la cadena de conexión tiene contexto. –

+0

No relacionado con la pregunta, pero como está utilizando un bloque "usar", no necesita hacer conexión. Cerrar() cuando el final del alcance en el bloque de uso se cerraría automáticamente y eliminaría su conexión – dotnetguy

Respuesta

5

Creo que confundes para qué sirve exactamente SqlCommand.CommandTimeout. Según this MSDN reference:

Obtiene o establece el tiempo de espera antes de terminar el intento de ejecutar un comando y generar un error.

En su caso, está ejecutando un DataReader y revisando su consulta (cualquiera que sea). Se está tomando un tiempo mínimo para cada Read() por lo que no se estaría agotando el tiempo de espera.

Editar:

Si está utilizando una cadena de conexión equivocada, su Timeout no será el límite de comando, pero será el tiempo de conexión. Esto predeterminado es 15 segundos. Ese es el tiempo de espera que es efectivo en su situación.

Va a agotar el tiempo de espera en el método de llamada SqlConnection.Open(), no SqlCommand.ExecuteReader(). Por lo tanto, la propiedad ConnectionTimeout va a ser el valor de tiempo de espera efectivo.

SqlConnection.ConnectionTimeout Property MSDN Reference

+0

El punto es, como Dije sobre la pregunta, estoy probando esto con una cadena de conexión incorrecta, por lo que no puedo leer nada. Debido a eso, esperaba que mi tiempo de ejecución fuera solo el tiempo de espera. –

+0

@ FlávioIvan Ah, está bien. Ya veo. Por favor mira mi edición. Su 'SqlCommand.CommandTimeout' no es lo que se utilizará para el tiempo de espera en una mala conexión. Esa será la propiedad 'SqlConnection.ConnectionTimeout'. –

+0

¡Gracias, tiburón! Acabo de probarlo y ahora veo que el tiempo de ejecución cambia. Todavía me está tomando más tiempo de ejecución que el tiempo de espera que establecí, pero ahora puedo jugar con él. :) –

1

También es necesario comprobar el tiempo de espera de conexión que tiene un valor predeterminado de 15 segundos.

Véase también http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout.aspx - si su cadena de conexión tiene contexto entonces se ignora CommandTimeout

+0

Lo siento, olvidé mencionar eso en la pregunta, pero no tengo contexto en mi cadena de conexión. –

+0

"También necesita verificar el tiempo de espera de conexión que tiene un valor predeterminado de 15 segundos". +1 –

0

También puede especificar esto en su cadena de conexión en el archivo de configuración:

<connectionStrings> 
    <add name="*con_name*" connectionString="data source=*dsource*;initial catalog=*catalog*;integrated security=True;Connect Timeout=300;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> 
</connectionStrings>