116 votes

Ajustement de CommandTimeout dans Dapper.NET?

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

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

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

La seule configuration de CommandTimeout que je connaisse est dans SqlCommand. Existe-t-il un moyen de le configurer via Dapper ?

1 votes

Pour une raison quelconque, je ne peux pas répondre à ma propre question en ce moment. Mais il semble qu'ajouter simplement l'argument nommé "commandTimeout: 0" à c.Execute() a réglé ce problème.

124voto

jzacharuk Points 553

Oui, il existe plusieurs versions de la fonction Execute. L'une d'entre elles 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)

Extrait de SqlMapper.cs

4 votes

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

0 votes

De mon expérience, la propriété commandTimeout n'est pas utilisée lors de l'utilisation de async await comme indiqué dans la documentation de msdn (goo.gl/2NVlXL). Un peu ennuyeux, j'espère que cela aide.

2 votes

@DrSchizo pourquoi ne serait-il pas utilisé, il n'y a aucune raison pour Async Await d'éviter le Time out

67voto

Adrian Carr Points 535

Exemple de la question originale avec la réponse acceptée ajoutée, au cas où quelqu'un en aurait besoin. (Le délai d'attente est fixé à 60 secondes) :

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

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

38voto

Mozart Al Khateeb Points 133

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

Dapper.SqlMapper.Settings.CommandTimeout = 0;

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

Cela permet d'éliminer la duplication, et si vous décidez de le modifier ultérieurement, vous le modifiez une seule fois à un seul endroit.

3voto

Amanda Mata Points 57

J'ai pu résoudre mon problème en utilisant connection.Query en définissant le timeout directement

int timeOutInSeconds = 60;
.
.
.
result = conn.Query(stringQuery, new {parameters, ..}, null, true, timeOutInSeconds).ToList();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X