2014-09-23 11 views
9

Mam program C#, który uruchamia procedurę przechowywaną. Jeśli uruchomię procedurę składowaną ze studia zarządzania serwerem sql firmy Microsoft, to działa dobrze. Wykonanie trwa około 30 sekund. Jednak jeśli spróbuję uruchomić tę samą procedurę przechowywaną z programu C#, upłynie limit czasu, nawet jeśli ustawiłem limit czasu w ciągu połączenia na 10 minut.Jak zapobiec błędowi przekroczenia limitu czasu podczas wykonywania procedury składowania przy użyciu polecenia SqlCommand?

using (connection1 = new SqlConnection("user id=user_id_goes_here;password=password_goes_here;initial catalog=database_name_goes_here;data source=server_name_goes_here;connection timeout=600)) 

Wydaje się, że upłynął czas około 30 sekund, mimo że ustawiłem go na 10 minut (w celach testowych).

+1

Jak wywołujesz procedurę? Coś, co zajmuje 30 sekund od studia zarządzającego, nie powinno zająć 10 minut od C#, chyba że popełnisz błąd gdzieś, który łamie indeksy lub statystyki. –

Odpowiedz

17

Limit czasu w połączeniu służy tylko do połączenia z bazą danych.

Istnieje osobna właściwość CommandTimeout klasy SqlCommand, którą zakładam do wykonania zapisanego procesu. Ta właściwość służy do określania limitu czasu wykonania.

Tzn.

using (SqlCommand cmd = new SqlCommand()) 
{ 
    cmd.Connection = connection1; 
    cmd.CommandTimeout = 240; //in seconds 
    //etc... 
} 
+3

Jeśli użyjesz 0, oznacza to brak limitu. – Juan

+2

Wystarczy podkreślić, że jest to tylko "pomoc zespołowa" dla problemu. Lepiej zorientować się, dlaczego masz czas oczekiwania, rozwiązując podstawowy problem. –

+1

@ChrisDunaway Zakładam, że nigdy nie pracowałeś w dużych bazach danych? Miałem w projektach SP pracę przez wiele godzin w nocy, integrując zbiory danych na poziomie terabajtów. Czasami potrzebujesz czasu na rzeczy. – TomTom

6

Użyj właściwości SqlCommand.CommandTimeout zamiast określać ją w łańcuchu połączenia.

Dla porównania patrz MSDN.

2

Należy ustawić go w kodzie, np. Ustawiając właściwość CommandTimeout obiektu polecenia sql.

Parametr "timeout połączenia" w ciągu połączenia reprezentuje czas oczekiwania podczas próby ustanowienia połączenia przed zakończeniem próby i wygenerowaniem błędu. To nie czas, po którym upłynie czas wykonywania zapytań.

Dzięki, również kilka tygodni temu spotkałem się z tym samym problemem i pomieszano między wartościami limitu czasu w webconfig vs w obiekcie polecenia. Twoje pytanie wyczyszczone ma teraz moje wątpliwości :)

reference link from msdn

1

Connection timeout odnosi się do ilości czasu dopuszczalnego podczas gdy faktycznie łączenia się z SQL Server. Limit czasu polecenia odnosi się do tego, jak długo jest dopuszczalne wykonywanie polecenia; w tym przypadku procedura składowana. SqlCommand.CommandTimeout jest nieruchomością, której szukasz.