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?
Réponses:
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
la source
SqlConnection.ConnectionTimeout Property
mais 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.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); }
la source
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.
la source
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();
la source