2012-07-16 14 views
6

Mam zapytanie, które trwa dłużej, ponieważ baza danych zwiększa rozmiar. Zapytanie jest zoptymalizowany i konieczne, ale mój C# Console Application został ostatnio daje mi ten błąd:MySqlException: Limit czasu wygasł - Zwiększenie limitu czasu połączenia nie przyniosło skutku

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

zwiększenie czasu połączenia w ciągu połączenia nie pomoże; I zwiększył ją z

Connect Timeout=28800

do

Connect Timeout=128800

ale nadal jestem uzyskiwanie błąd pomimo tej zmiany.

Jeśli uruchomię zapytanie ze środowiska roboczego MySQL, zajmie to tylko około 10 sekund, więc nie jestem pewien, jak zapobiec temu nieobsługiwanemu wyjątkowi.

Czy są inne rzeczy, poza tym, że "czas wykonania zapytania" może wytworzyć ten wyjątek?

+3

Czy możesz pokazać swój kod? –

+8

Zmień parametr CommandTimeout, a nie ConnectionTimeout. –

+0

Nieobsługiwany wyjątek: Wyjątek System.ArgumentException: Słowo kluczowe nie jest obsługiwane. Nazwa parametru: connecttimeout w Application.MainClass.Main (String [] args) Och, muszę cię bardziej uważnie przeczytać, "CommandTimeout". –

Odpowiedz

16

miałem ten problem przed. Właściwość ConnectTimeout ma zastosowanie tylko do limitów czasu, które występują podczas łączenia się z bazą danych, a nie kwerend.

CommandTimeout określa jednak, jak długo powinien czekać na zwrot zapytania. Domyślne ustawienie to 30 sekund. Dwukrotnie sprawdź dokumentację twojej biblioteki MySql, ale dla SqlCommand CommandTimeout jest w sekundach, a nie milisekundach.

+3

W MySQL jest to również sekunda. również - 0 nie jest limitem czasu. –

3

Jeśli możesz pokazać nam swoją metodę, możemy pomóc znaleźć błędy.

Jeśli historia (i SO) nauczył mnie czegoś, jego

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

Jeśli nie jesteś pewny jak używać komend parametrami tutaj jest przykład (zaczerpnięte z jednej z odpowiedzi, gdzie nie używałem parametryzowane SQL)

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

Spróbuj, że jeśli nie ma już i pisać kodu :)

+0

Dzięki za podpowiedź –

1

Możesz również spróbować dodać "domyślny limit czasu polecenia = 360" w ciągu połączenia; np

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

Ta opcja jest dostępna od Connector/NET w wersji 5.1.4.

[Podniosłem to z connectionstrings.com/mysql/

Powiązane problemy