2012-07-16 28 views
6

Tengo una consulta que tarda más en ejecutarse a medida que la base de datos aumenta de tamaño. La consulta se optimiza y necesaria, pero mi C# aplicación de consola ha recientemente me ha estado dando este error:MySqlException: expiró el tiempo de espera: el aumento del tiempo de espera de la conexión no tuvo efecto

Unhandled Exception: MySql.Data.MySqlClient.MySqlException: Timeout expired. 

El aumento del tiempo de conexión en la cadena de conexión no ayuda; He aumentado desde

Connect Timeout=28800

a

Connect Timeout=128800

pero todavía estoy consiguiendo el error a pesar de este cambio.

Si ejecuto la consulta desde el banco de trabajo MySQL solo me llevará unos 10 segundos, por lo que no estoy seguro de cómo evitar esta Excepción no controlada.

¿Hay otras cosas, además de "el tiempo que tarda una consulta", que pueden producir esta excepción?

+3

Se puede mostrar su código? –

+8

Cambia CommandTimeout no ConnectionTimeout. –

+0

Excepción no controlada: System.ArgumentException: palabra clave no admitida. Nombre del parámetro: connecttimeout en Application.MainClass.Main (String [] args) Oh, necesito leerlo con más detalle, "CommandTimeout". –

Respuesta

16

que he tenido este problema antes. La propiedad ConnectTimeout solo se aplica a los tiempos de espera que se producen al conectarse a la base de datos, no a las consultas.

CommandTimeout sin embargo, especifica cuánto tiempo debe esperar para que vuelva la consulta. Creo que el valor predeterminado es 30 segundos. Revise la documentación de su biblioteca MySql, pero para SqlCommand, CommandTimeout está en segundos, no en milisegundos.

+3

En MySQL también son segundos. También - 0 no hay tiempo de espera. –

3

Si nos puede mostrar su método, podemos ayudarlo a encontrar los errores.

Si la historia (y SO) me ha enseñado algo, su

"You better be using Paramaterized SQL statements before posting any code" 

Si no está seguro sobre cómo utilizar los comandos parametrizados aquí es un ejemplo (tomado de una de las respuestas en el que no utilizo SQL parametrizada)

var command = new MySqlCommand(
    "SELECT * FROM tblPerson WHERE LastName = @Name AND Height > @Height AND BirthDate < @BirthDate", connection); 

command.Parameters.AddWithValue("@Name", lastname); 
command.Parameters.AddWithValue("@Height", height); 
command.Parameters.AddWithValue("@Name", birthDate); 

Trate de que si no lo ha hecho y publicar algo de código :)

+0

Gracias por este consejo. –

1

También puede intentar agregar "tiempo de espera del comando predeterminado = 360" en su cadena de conexión; por ejemplo,

Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;default command timeout=20; 

Esta opción está disponible en Connector/NET versión 5.1.4.

[Levanté esto desde connectionstrings.com/mysql/

Cuestiones relacionadas