Как предотвратить ошибку тайм-аута при выполнении процедуры сохранения с помощью SqlCommand?

У меня есть программа на С#, которая запускает хранимую процедуру. Если я запускаю хранимую процедуру из студии управления сервером Microsoft sql, она работает нормально. Выполнение занимает около 30 секунд. Однако, если я попытаюсь запустить ту же хранимую процедуру из программы C#, время ожидания истечет, хотя я установил время ожидания в строке подключения на 10 минут.

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

Кажется, время ожидания истекает примерно через 30 секунд, хотя я установил его на 10 минут (для целей тестирования).


person oshirowanen    schedule 23.09.2014    source источник
comment
Как вы вызываете процедуру? Что-то, что занимает 30 секунд в студии управления, не должно занимать 10 минут в C#, если только вы не допустили где-то ошибку, которая нарушает индексы или статистику.   -  person Joel Coehoorn    schedule 25.09.2014


Ответы (4)


Тайм-аут соединения предназначен только для подключения к базе данных.

Существует отдельное свойство CommandTimeout класса SqlCommand, используйте это свойство, чтобы указать время ожидания выполнения.

Ie.

using (SqlCommand cmd = new SqlCommand())
{
  cmd.Connection = connection1;
  cmd.CommandTimeout = 240; //in seconds
  //etc...
}
person Patrick Allwood    schedule 23.09.2014
comment
Если вы используете 0, это означает отсутствие ограничений. - person Juan; 24.09.2014
comment
Просто чтобы указать, что это всего лишь пластырь для решения проблемы. Лучше сначала выяснить, почему вы получаете тайм-аут, решив основную проблему. - person Chris Dunaway; 25.09.2014
comment
@ChrisDunaway Я полагаю, вы никогда не работали с большими базами данных? В проектах у меня были СП, которые часами по ночам работали над интеграцией наборов данных терабайтного уровня. Иногда вам просто нужно время для вещей. - person TomTom; 25.09.2014
comment
@TomTom - Согласен, но то, что вы описываете, звучит как исключение, а не правило. Судя по ОП, маловероятно, что они работают с таким большим количеством данных. Скорее всего, им просто нужны хорошие индексы и запросы с хорошими планами выполнения. - person Chris Dunaway; 25.09.2014

Используйте свойство SqlCommand.CommandTimeout вашей команды вместо указания его в строке подключения.

См. MSDN для справки.

person Andy Korneyev    schedule 23.09.2014

Вам нужно установить его в коде, т.е. установив свойство CommandTimeout объекта команды sql.

Параметр 'время ожидания соединения' в строке подключения представляет собой время ожидания при попытке установить соединение перед завершением попытки и созданием ошибки. Это не время, после которого время выполнения запроса истечет.

Спасибо, я также столкнулся с той же проблемой несколько недель назад и запутался между значениями времени ожидания в webconfig и в объекте команды. Ваш вопрос снят, теперь у меня есть сомнения :)

ссылка на ссылку из msdn

person Satyajit    schedule 23.09.2014

Тайм-аут подключения относится к количеству времени, допустимому при фактическом подключении к SQL Server. Тайм-аут команды относится к тому, как долго разрешено выполнение команды; в данном случае хранимая процедура. SqlCommand.CommandTimeout — это недвижимость, которую вы ищете.

person krisdyson    schedule 23.09.2014