Как продлить время ожидания SQL-запроса

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

Код функции выглядит примерно так:

SqlDatabase db = new SqlDatabase(connectionManager.SqlConnection.ConnectionString);
return db.ExecuteScalar(Enum.GetName(typeof(StoredProcs), storedProc), parameterValues);

Время вызова ExecuteScalar истекло. Как я могу продлить период ожидания этой функции?

Для быстрых хранимых процедур это работает нормально. Но одна из функций занимает некоторое время, и вызов не выполняется. Кажется, я не могу найти способ продлить период ожидания, когда функция ExecuteScalar вызывается таким образом.

 BoltBait10 июл. 2009 г., 23:06
Хорошо, занижение моего вопроса просто грубо. Мой вопрос четко определен и (надеюсь) имеет ответ.

Ответы на вопрос(6)

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

 BoltBait10 июл. 2009 г., 22:39
Спасибо, что сказали мне оптимизировать мое приложение. Вздох. В долгосрочной перспективе это может произойти, но для СЕГОДНЯ мне просто нужно запустить эту штуку.
 13 июл. 2009 г., 13:31
Я конечно имел в виду не обижаться. Просто, если время ожидания SQL истекло, маловероятно, что вы сможете найти тайм-аут, который будет работать в любой ситуации. Во многих случаях вы хотите, чтобы время ожидания превышало допустимое значение SQL, а значение по умолчанию все еще довольно велико.

Вы делаете это, устанавливаяSqlCommand.CommandTimeout имущество

 10 июл. 2009 г., 23:10
Перепишите его, чтобы использовать db.CreateConnection (); у вас будет 4-5 дополнительных строк кода, но легкий доступ к объекту SqlCommand.
 BoltBait10 июл. 2009 г., 22:57
@Joel, эта функция определена в файле Microsoft.Practices.EnterpriseLibrary.Data.dll Хммм ... не уверен, что у меня есть исходный код для этого. Поиск ...
 BoltBait10 июл. 2009 г., 22:36
Это было бы прекрасно, если бы я использовал SqlCommand ... но я не так.
 10 июл. 2009 г., 22:52
«Кто-то» Может быть, Microsoft, хотя - это класс SQLDatabase из Microsoft.Practices.EnterpriseLibrary?
 10 июл. 2009 г., 22:43
Да, вы. SqlDatabase не является частью стандартного поставщика данных; это класс-оболочка, который кто-то написал, и он будет использовать объект SqlCommand для внутреннего использования.

Попробуй это

SqlConnectionStringBuilder connectionStringBuilder = new SqlConnectionStringBuilder(connection.ConnectionString);
connectionStringBuilder.ConnectTimeout = 180;
connection.ConnectionString = connectionStringBuilder.ConnectionString;

connection.Open();
SqlCommand command = new SqlCommand("sp_ProcedureName", connection);
command.CommandType = CommandType.StoredProcedure;
command.CommandTimeout = connection.ConnectionTimeout;
command.ExecuteNonQuery();
connection.Close();

что это может быть лучший способ сделать это (начиная с Enterprise Library 6.0):

SqlDatabase db = new SqlDatabase(connectionManager.SqlConnection.ConnectionString);
System.Data.Common.DbCommand cmd = db.GetStoredProcCommand(storedProc, parameterValues);
cmd.CommandTimeout = 600;
return db.ExecuteScalar(cmd);
 02 мая 2016 г., 09:02
спасибо, приятель, это сэкономит мне много часов. очень ценится
Решение Вопроса

Если вы используете EnterpriseLibrary (и, похоже, вы это делаете), попробуйте это:

 Microsoft.Practices.EnterpriseLibrary.Data.Database db = Microsoft.Practices.EnterpriseLibrary.Data.DatabaseFactory.CreateDatabase("ConnectionString");
 System.Data.Common.DbCommand cmd = db.GetStoredProcCommand("StoredProcedureName");
 cmd.CommandTimeout = 600;
 db.AddInParameter(cmd, "ParameterName", DbType.String, "Value");

 // Added to handle paramValues array conversion
 foreach (System.Data.SqlClient.SqlParameter param in parameterValues) 
 {
     db.AddInParameter(cmd, param.ParameterName, param.SqlDbType, param.Value);
 }

 return cmd.ExecuteScalar();

Отредактировано для обработки массива paramValues напрямую на основе комментариев. Я также включил ваше значение ConnectionString:

Microsoft.Practices.EnterpriseLibrary.Data.Database db = Microsoft.Practices.EnterpriseLibrary.Data.DatabaseFactory.CreateDatabase(connectionManager.SqlConnection.ConnectionString);
System.Data.Common.DbCommand cmd = db.GetStoredProcCommand("StoredProcedureName", parameterValues);
cmd.CommandTimeout = 600;
return cmd.ExecuteScalar();
 BoltBait10 июл. 2009 г., 23:14
Пробую это сейчас ...
 10 июл. 2009 г., 23:55
Хорошая находка, отредактированная, чтобы показать & quot; правильную & quot; решение. Это решило вашу проблему?
 10 июл. 2009 г., 23:44
Я добавил код, который должен преобразовывать ваш массив paramValues в параметры, ожидаемые DbCommand.
 BoltBait10 июл. 2009 г., 23:27
Хм ... У меня нет доступа к ParameterNames. Переменная parameterValues в моем примере кода определяется как & quot; object [] parameterValues & quot ;. Могу ли я добавить параметры, не зная в именах только порядок?
 BoltBait10 июл. 2009 г., 23:48
Незачем. Вы просто добавляете его в команду GetStoredProcCommand.

Тайм-аут может возникнуть из-за проблемы Microsoft. Кажется, все еще происходит в моей системе Windows 8.

http://support.microsoft.com/kb/2605597?wa=wsignin1.0

Ваш ответ на вопрос