Налаштування CommandTimeout у Dapper.NET?


92

Я намагаюся запустити резервні копії SQL через збережену процедуру через Dapper (решта мого додатка використовує Dapper, тому я б волів, щоб ця частина також працювала через нього). Це чудово працює, доки не запуститься CommandTimeout.

using (var c = SqlConnection(connstring))
{
    c.Open();
    var p = new DynamicParameters();
    // fill out p

    c.Execute("xp_backup_database", p, commandType: CommandType.StoredProcedure);
}

Єдине налаштування CommandTimeout, яке мені відомо, знаходиться в SqlCommand. Чи є спосіб встановити це через Dapper?


1
З будь-якої причини, я не можу відповісти на власне запитання зараз. Але, здається, просто додавши названий аргумент "commandTimeout: 0" до c.Execute () подбав про це.
sh-beta

Відповіді:


106

Так, існує кілька версій функції Execute. Один (або більше) з них містить параметри commandTimeout:

public static int Execute(this IDbConnection cnn, string sql, 
                dynamic param = null, IDbTransaction transaction = null, 
                            int? commandTimeout = null, CommandType? commandType = null)

Взято з SqlMapper.cs


4
У мене була та ж проблема, але з методом Query, проте рішення теж спрацювало на неї, оскільки вона також має параметр commandTimeout.
джаху

2
@DrSchizo, чому б його не використовувати, немає жодної причини, щоб Async Await уникав Тайм-ауту
Mrinal Kamboj

1
@DrSchizo Документи кажуть, що він не використовується з асинхронними методами, такими як BeginExecuteReader, а не async / await. Я припускаю, що це тому, що якщо ви використовуєте BeginExecuteReader, передбачається, що ви будете використовувати свою власну логіку таймауту.
jugg1es

3
Чи можна встановити цей час очікування для всіх запитів? Я спробував із, SqlConnection.ConnectionTimeout Propertyале там написано, що це лише для читання. Він мені знадобився б для деяких спеціальних програм міграції. Втомливо друкувати його з кожним твердженням.
Тадей

5
@jedatkinports SqlMapper.Settings.CommandTimeout Я вважаю, це те, що вам потрібно.
Шив,

59

Приклад з оригінального запитання з доданою прийнятою відповіддю, якщо хтось цього хоче. (Час очікування встановлено на 60 секунд):

using (var c = SqlConnection(connstring))
{
    c.Open();
    var p = new DynamicParameters();
    // fill out p

    c.Execute("xp_backup_database", p, commandTimeout: 60, 
                                       commandType: CommandType.StoredProcedure);
}

6

Немає необхідності встановлювати час очікування команди для всіх запитів / дзвінків на базу даних. Ви можете встановити глобально, як показано нижче.

Dapper.SqlMapper.Settings.CommandTimeout = 0;

Ви можете ініціалізувати цю статичну властивість під час завантаження програми або в конструкторі класу бази даних.

Це допомагає усунути дублювання, і якщо ви вирішите змінити його пізніше, ви зміните його один раз.


0

Я зміг вирішити свою проблему, використовуючи підключення. Query безпосередньо встановлюючи час очікування

int timeOutInSeconds = 60;
.
.
.
result = conn.Query<list>(stringQuery, new {parameters, ..}, null, true, timeOutInSeconds).ToList();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.