Настройка 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.
jahu

2
@DrSchizo, почему бы его не использовать, у Async Await нет причин избегать тайм-аута
Мринал Камбодж

1
@DrSchizo В документах говорится, что он не используется с асинхронными методами, такими как BeginExecuteReader, а не async / await. Я предполагаю, что это связано с тем, что если вы используете BeginExecuteReader, предполагается, что вы будете использовать свою собственную логику тайм-аута.
jugg1es 02

3
Можно ли установить этот таймаут для всех запросов? Я пробовал использовать, SqlConnection.ConnectionTimeout Propertyно там написано, что он доступен только для чтения. Мне он понадобится для некоторых пользовательских программ миграции. Утомительно набирать его с каждым утверждением.
Tadej

5
@jedatkinports SqlMapper.Settings.CommandTimeout Я считаю, что это то, что вам нужно.
Shiv

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

Мне удалось решить свою проблему с помощью подключения.Запрос, установив тайм-аут напрямую

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.