Ajuster CommandTimeout dans Dapper.NET?


92

J'essaie d'exécuter des sauvegardes SQL via une procédure stockée via Dapper (le reste de mon application utilise Dapper, je préfère donc continuer à faire fonctionner cette partie). Cela fonctionne très bien jusqu'à ce que CommandTimeout entre en jeu.

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

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

Le seul paramètre CommandTimeout que je connaisse est dans SqlCommand. Existe-t-il un moyen de définir cela via Dapper?


1
Pour une raison quelconque, je ne peux pas répondre à ma propre question pour le moment. Mais il semble que l'ajout de l'argument nommé "commandTimeout: 0" à c.Execute () a pris soin de cela.
sh-beta

Réponses:


106

Oui, il existe plusieurs versions de la fonction Execute. Un (ou plusieurs) d'entre eux contient les paramètres commandTimeout:

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

Tiré de SqlMapper.cs


4
J'ai eu le même problème, mais avec la méthode Query, mais la solution a également fonctionné, car elle a également un paramètre commandTimeout.
jahu

2
@DrSchizo pourquoi ne serait-il pas utilisé, il n'y a aucune raison pour qu'Async Await évite le Time out
Mrinal Kamboj

1
@DrSchizo La documentation dit qu'il n'est pas utilisé avec des méthodes asynchrones comme BeginExecuteReader, pas async / await. Je suppose que c'est parce que si vous utilisez BeginExecuteReader, il est supposé que vous utiliserez votre propre logique de délai d'expiration.
jugg1es

3
Est-il possible de définir ce délai pour toutes les requêtes? J'ai essayé avec le SqlConnection.ConnectionTimeout Propertymais il dit qu'il est en lecture seule. J'en aurais besoin pour certains programmes de migration personnalisés. Il est fastidieux de le taper avec chaque instruction.
Tadej le

5
@jedatkinports SqlMapper.Settings.CommandTimeout Je crois que c'est ce que vous recherchez.
Shiv

59

Exemple de question originale avec réponse acceptée ajoutée, au cas où quelqu'un le voudrait. (Le délai d'expiration est réglé sur 60 secondes):

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

Il n'est pas nécessaire de définir le délai d'expiration de la commande pour toutes les requêtes / appels Db. Vous pouvez définir globalement comme ci-dessous.

Dapper.SqlMapper.Settings.CommandTimeout = 0;

Vous pouvez initialiser cette propriété statique sur le chargement de l'application ou dans le constructeur de classe de base de données.

Cela aide à supprimer la duplication, et au cas où vous décidez de le changer plus tard, vous le changez une fois.


0

J'ai pu résoudre mon problème en utilisant connection.Query fixant le délai d'expiration directement

int timeOutInSeconds = 60;
.
.
.
result = conn.Query<list>(stringQuery, new {parameters, ..}, null, true, timeOutInSeconds).ToList();
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.