Cambiar el tiempo de espera de SqlConnection

81

Estoy intentando anular el SqlConnectiontiempo de espera predeterminado de 15 segundos y aparece un error que dice que el

la propiedad o el indexador no se pueden asignar porque es de solo lectura.

¿Hay alguna forma de evitar esto?

using (SqlConnection connection = new SqlConnection(Database.EstimatorConnection))
{
   connection.Open();

   using (SqlCommand command = connection.CreateCommand())
   {
       command.CommandType = CommandType.StoredProcedure;
       connection.ConnectionTimeout = 180; // This is not working 
       command.CommandText = "sproc_StoreData";
       command.Parameters.AddWithValue("@TaskPlanID", order.Projects[0].TaskPlanID);
       command.Parameters.AddWithValue("@AsOfDate", order.IncurDate);

       command.ExecuteNonQuery();
    }
}
Haymak3r
fuente
5
¿Quiere establecer un tiempo de espera de conexión después de intentar abrir la conexión? ¿Te refieres a commandtimeout?
Alex K.
2
Realmente, realmente no veo por qué hicieron que la propiedad fuera de solo lectura. Debería haber sido de lectura y escritura, en mi opinión.
xofz
La propiedad es de solo lectura después de la conexión. Vea otras respuestas para discusión. ConnectionTimeout impacta el tiempo de espera al intentar conectarse. A menudo es útil aumentar esto para Azure SQL DB. CommandTimeout impacta el tiempo de espera cuando se ejecuta una consulta.
Bill Gibson - MSFT
@Sam Pearson Es de lectura y escritura hasta que se abre la conexión, es decir, cuando connection.Open (); se llama. A partir de este punto, el temporizador ya está funcionando.
WonderWorker

Respuestas:

155

Si desea proporcionar un tiempo de espera para una consulta en particular, CommandTimeout es el camino a seguir.

Su uso es:

command.CommandTimeout = 60; //The time in seconds to wait for the command to execute. The default is 30 seconds.
Anil Mathew
fuente
15
No está hablando del tiempo de espera del comando, sino del tiempo de espera de la conexión.
LarryBud
39

Puede establecer el valor de tiempo de espera en la cadena de conexión, pero después de conectarse es de solo lectura. Puede leer más en http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectiontimeout.aspx

Como sugiere Anil, ConnectionTimeout puede no ser lo que necesita; controla cuánto tiempo esperará el controlador ADO al establecer una nueva conexión. Su uso parece indicar la necesidad de esperar más de lo normal para que se ejecute una consulta SQL en particular, y en ese caso Anil tiene exactamente la razón; use CommandTimeout (que es R / W) para cambiar el tiempo de finalización esperado para un SqlCommand individual.

KeithS
fuente
19

Una forma más limpia es establecer connectionString en un archivo xml, por ejemplo Web.Confing(WepApplication)o App.Config(StandAloneApplication).

 <connectionStrings>
    <remove name="myConn"/>
    <add name="myConn" connectionString="User ID=sa;Password=XXXXX;Initial Catalog=qualitaBorri;Data Source=PC_NAME\SQLEXPRESS;Connection Timeout=60"/>
  </connectionStrings>

Por código puede obtener la conexión de esta manera:

public static SqlConnection getConnection()
{
        string conn = string.Empty;
        conn = System.Configuration.ConfigurationManager.ConnectionStrings["myConn"].ConnectionString;
        SqlConnection aConnection = new SqlConnection(conn);
        return aConnection;
}

Solo puede configurar ConnectionTimeoutsi crea una instancia. Cuando se crea la instancia, no cambia este valor.

daniele3004
fuente
17

Siempre puede agregarlo a su Cadena de conexión:

connect timeout=180;
Justin Niessner
fuente
2
Connection Timeout es diferente de CommandTimeout. El tiempo de espera de conexión es la cantidad de tiempo que lleva resolver la conexión inicial a la base de datos. CommandTimeout cambia el período de tiempo de espera para la consulta en particular.
m0g
@ m0g No entiendo por qué esta no es la respuesta aceptada. La pregunta aquí probablemente sea muy clara sobre el tiempo de espera de conexión, que por defecto es 15, y es una propiedad de solo lectura de una SqlConnection que debe definirse en la cadena de conexión. La línea de código que el póster enumera intenta específicamente establecer SqlConnection.ConnectionTimeout. El Command Timeout tiene un valor predeterminado de 30 y es un parámetro de lectura / escritura de SqlCommand, un objeto completamente diferente. El mensaje de error de la pregunta muestra un valor de 15 y la pregunta dice específicamente SqlConnection, no SqlCommand.
Bocados de tocino
1
@BaconBits lo que el cartel de la pregunta describió y preguntó versus lo que él quiere es diferente, por lo tanto, la respuesta aceptada es algo diferente.
m0g
8

Puede agregar Connection Timeout=180;a su cadena de conexión

Horev Ivan
fuente
4
Connection Timeout es diferente de CommandTimeout. El tiempo de espera de la conexión es la cantidad de tiempo que se tarda en resolver la conexión inicial a la base de datos. CommandTimeout cambia el período de tiempo de espera para la consulta en particular.
m0g
7

También puede utilizar SqlConnectionStringBuilder

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(ConnectionString);
builder.ConnectTimeout = 10;
using (var connection = new SqlConnection(builder.ToString()))
{
    // code goes here
}
Kelvin
fuente
6

Publicación anterior, pero a medida que surge lo que estaba buscando, pensé en agregar algo de información a este tema. Iba a agregar un comentario pero no tengo suficiente reputación.

Como han dicho otros:

connection.ConnectionTimeout se utiliza para la conexión inicial

command.CommandTimeout se utiliza para búsquedas individuales, actualizaciones, etc.

Pero:

connection.ConnectionTimeout también se usa para confirmar y revertir transacciones.

Sí, esta es una decisión de diseño absolutamente loca.

Por lo tanto, si se está agotando el tiempo de espera en la confirmación o la reversión, deberá aumentar este valor mediante la cadena de conexión.

Nick Thompson
fuente
"Connection.ConnectionTimeout también se usa para confirmar y deshacer transacciones. Sí, esta es una decisión de diseño absolutamente loca". De Verdad? No creo que esto sea cierto. Si fuera cierto, cualquier transacción que dure más que el tiempo de espera de conexión de 15 segundos fallará. Necesitas aclarar.
Triynko
Ahora, si te refieres a que se usó como tiempo de espera para enviar solo el comando de confirmación o retroceso por sí solo, entonces no ... esa no es una decisión loca. Es básicamente un comando instantáneo que debería regresar de inmediato, ya que solo indica al servidor que se comprometa o retroceda. Si no llega al servidor y obtiene una respuesta de inmediato, entonces es básicamente un tiempo de espera de conexión, por lo que tendría sentido usarlo de esa manera.
Triynko
3

Puede establecer el tiempo de espera de la conexión en el nivel de conexión y el nivel de comando.

Agregue "Connection Timeout = 10" a la cadena de conexión. Ahora el tiempo de espera de la conexión es de 10 segundos.

var connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;Connection Timeout=10";
using (var con = new SqlConnection(connectionString))
{

}

Establezca la propiedad de CommandTimeout en SqlCommand

var connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword";
using (var con = new SqlConnection(connectionString))
{

    using (var cmd =new SqlCommand())
    {
        cmd.CommandTimeout = 10;
    }

}
Jakir Hossain
fuente
2

Necesitas usar command.CommandTimeout

LewisT
fuente