Тайм-аут хранимой процедуры, вызываемый из кода, выполняется нормально из SSMS

У меня есть хранимая процедура, которая при вызове из SSMS занимает около 10 секунд и выполняется успешно. Процедура принимает в качестве параметра int.

При вызове той же хранимой процедуры из кода:

using (var connection = new SqlConnection(ConnectionStringName))
{
    using (var cmd = new SqlCommand("ProcedureName", connection))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("@itemId", itemId));
        cmd.CommandTimeout = 150;

        connection.Open();
        cmd.ExecuteNonQuery(); 
    }
} 

Я получаю следующую ошибку:

System.Data.SqlClient.SqlException (0x80131904): Timeout expired.  
The timeout period elapsed prior to completion of the operation or the server is not responding. ---> 
System.ComponentModel.Win32Exception (0x80004005): The wait operation timed out

Переданный параметр действителен, и при вызове хранимой процедуры из SSMS с тем же значением параметра она выполняется правильно.


person Tamas Ionut    schedule 10.06.2015    source источник
comment
Сколько времени занимает выполнение из SSMS?   -  person rikitikitik    schedule 10.06.2015
comment
@ shA.t Удалил эту строку, и я получаю то же исключение, только быстрее.   -  person Tamas Ionut    schedule 10.06.2015
comment
Используя cmd.CommandTimeout = 0;, вы никогда не увидите эту ошибку, но ваша проблема находится внутри вашей хранимой процедуры, которая требует некоторых изменений;).   -  person shA.t    schedule 10.06.2015
comment
Действительно, установка cmd.CommandTimeout = 0 решает проблему, и я бы отметил это как ответ. Однако время выполнения вызова SP занимает около 30 секунд, что намного больше, чем его вызов из SSMS. Есть какие-нибудь советы по этому поводу?   -  person Tamas Ionut    schedule 10.06.2015
comment
Я предлагаю вам задать другой вопрос и добавить код вашей хранимой процедуры для ее оптимизации (или проверьте это);).   -  person shA.t    schedule 10.06.2015


Ответы (2)


Чтобы избежать этой ошибки, просто используйте:

cmd.CommandTimeout = 0;

Примечание.
Выполнение запроса займет бесконечное время.

person shA.t    schedule 10.06.2015

Возможно, вы забыли указать направление параметра, поскольку вы можете указать параметры ввода и вывода. Попробуйте, если это сработает:

SqlParameter param = new SqlParameter("@itemId", itemId);
param.Direction = ParameterDirection.Input;
cmd.Parameters.Add(param);
person LInsoDeTeh    schedule 10.06.2015