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?


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


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);
}

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.


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();
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.