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?
Respostas:
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
fonte
SqlConnection.ConnectionTimeout Property
mas diz que é somente leitura. Eu precisaria dele para alguns programas de migração personalizados. É tedioso digitá-lo com cada declaração.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); }
fonte
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.
fonte
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();
fonte