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

Jzacharuk
источник
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();
Аманда Мата
источник