Как продлить таймаут SQL-запроса
Это не таймаут соединения, так как соединение с базой данных выполняется нормально. Проблема в том, что хранимая процедура, которую я вызываю, занимает больше времени, чем, скажем, 30 секунд и вызывает тайм-аут.
Код функции выглядит примерно так:
SqlDatabase db = new SqlDatabase(connectionManager.SqlConnection.ConnectionString);
return db.ExecuteScalar(Enum.GetName(typeof(StoredProcs), storedProc), parameterValues);
Вызов ExecuteScalar отключен. Как продлить период ожидания этой функции?
Для быстрых хранимых процедур он работает нормально. Но одна из функций занимает некоторое время, и вызов завершается с ошибкой. Кажется, я не могу найти способ продлить период таймаута, когда вызывается функция ExecuteScalar таким образом.
Ответы
Ответ 1
Если вы используете 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();
Ответ 2
сделайте это, установив SqlCommand.CommandTimeout свойство
Ответ 3
Я думаю, что это может быть лучшим способом сделать это (с 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);
Ответ 4
Попробуйте этот
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();
Ответ 5
Младен прав, но если вам нужно это сделать, у вас, вероятно, есть большая проблема с самим процессом. При загрузке может потребоваться гораздо больше времени, чем ваш новый тайм-аут. Возможно, стоит потратить некоторое время на качество, чтобы оптимизировать процесс.
Ответ 6
Время ожидания может произойти из-за проблемы Microsoft. Кажется, все еще происходит в моей системе Windows 8.
http://support.microsoft.com/kb/2605597?wa=wsignin1.0