¿Ajustando CommandTimeout en Dapper.NET?

92

Estoy tratando de ejecutar copias de seguridad de SQL a través de un procedimiento almacenado a través de Dapper (el resto de mi aplicación usa Dapper, así que preferiría mantener esta parte ejecutándose también). Funciona bien hasta que CommandTimeout se activa.

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

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

La única configuración de CommandTimeout que conozco está en SqlCommand. ¿Hay alguna forma de configurar esto a través de Dapper?

sh-beta
fuente
1
Por alguna razón, no puedo responder mi propia pregunta en este momento. Pero parece que simplemente agregando el argumento nombrado "commandTimeout: 0" a c.Execute () se encargó de esto.
sh-beta

Respuestas:

106

Sí, existen varias versiones de la función Ejecutar. Uno (o más) de ellos contiene los parámetros commandTimeout:

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

Tomado de SqlMapper.cs

jzacharuk
fuente
4
Tuve el mismo problema, pero con el método Query, sin embargo, la solución también funcionó, ya que también tiene un parámetro commandTimeout.
jahu
2
@DrSchizo ¿por qué no se usaría? No hay razón para que Async Await evite el tiempo de espera
Mrinal Kamboj
1
@DrSchizo Los documentos dicen que no se usa con métodos asincrónicos como BeginExecuteReader, no async / await. Supongo que esto se debe a que si usa BeginExecuteReader, se supone que usará su propia lógica de tiempo de espera.
Jugg1es
3
¿Es posible establecer este tiempo de espera para todas las consultas? Intenté con SqlConnection.ConnectionTimeout Propertypero dice que es de solo lectura. Lo necesitaría para algunos programas de migración personalizados. Es tedioso escribirlo con cada declaración.
Tadej
5
@jedatkinports SqlMapper.Settings.CommandTimeout Creo que es lo que buscas.
Shiv
59

Ejemplo de la pregunta original con respuesta aceptada agregada, en caso de que alguien lo desee. (El tiempo de espera se establece en 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
fuente
6

No es necesario establecer el tiempo de espera del comando para todas las consultas / llamadas a la base de datos. Puede configurar globalmente como a continuación.

Dapper.SqlMapper.Settings.CommandTimeout = 0;

Puede inicializar esta propiedad estática en la carga de la aplicación o en el constructor de la clase de base de datos.

Esto ayuda a eliminar la duplicación y, en caso de que decida cambiarlo más tarde, lo cambia una vez.

Mozart Al Khateeb
fuente
0

Pude resolver mi problema usando la conexión. Consulta configurando el tiempo de espera directamente

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