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?

sh-beta
la source
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

jzacharuk
la source
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);
}
Adrian Carr
la source
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.

Mozart Al Khateeb
la source
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();
Amanda Mata
la source