Ajustando CommandTimeout no Dapper.NET?

96

Estou tentando executar backups SQL por meio de um procedimento armazenado por meio do Dapper (o restante do meu aplicativo usa o Dapper, portanto, prefiro manter essa parte em execução também). Funciona bem até o CommandTimeout entrar em ação.

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

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

A única configuração de CommandTimeout que conheço está em SqlCommand. Existe uma maneira de definir isso via Dapper?

sh-beta
fonte
1
Por alguma razão, não posso responder minha própria pergunta agora. Mas parece que apenas adicionar o argumento nomeado "commandTimeout: 0" a c.Execute () cuidou disso.
sh-beta

Respostas:

108

Sim, existem várias versões da função Execute. Um (ou mais) deles contém os parâmetros commandTimeout:

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

Retirado de SqlMapper.cs

jzacharuk
fonte
4
Tive o mesmo problema, mas com o método Query, porém a solução funcionou para ele também, pois ele possui um parâmetro commandTimeout também.
jahu
2
@DrSchizo por que não seria usado, não há razão para Async Await evitar o tempo limite
Mrinal Kamboj
1
@DrSchizo Os documentos dizem que não é usado com métodos assíncronos como BeginExecuteReader, não async / await. Presumo que seja porque se você usar BeginExecuteReader, presume-se que você usará sua própria lógica de tempo limite.
jugg1es
3
É possível definir esse tempo limite para todas as consultas? Tentei com o SqlConnection.ConnectionTimeout Propertymas diz que é somente leitura. Eu precisaria dele para alguns programas de migração personalizados. É tedioso digitá-lo com cada declaração.
Tadej
6
@jedatkinports SqlMapper.Settings.CommandTimeout Eu acredito que é o que você procura.
Shiv
62

Exemplo de pergunta original com resposta aceita adicionada, caso alguém queira. (O tempo limite é definido para 60 segundos):

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);
}
Adrian Carr
fonte
11

Não há necessidade de definir o tempo limite do comando para todas as consultas / chamadas Db. Você pode definir globalmente como abaixo.

Dapper.SqlMapper.Settings.CommandTimeout = 0;

Você pode inicializar essa propriedade estática no carregamento do aplicativo ou no construtor da classe de banco de dados.

Isso ajuda a remover a duplicação e, caso você decida alterá-la mais tarde, pode alterá-la uma vez.

Mozart Al Khateeb
fonte
1

Consegui resolver meu problema usando conexão.Query definindo o tempo limite diretamente

int timeOutInSeconds = 60;
.
.
.
result = conn.Query<list>(stringQuery, new {parameters, ..}, null, true, timeOutInSeconds).ToList();
Amanda Mata
fonte