CommandTimeout in Dapper.NET anpassen?

89

Ich versuche, SQL-Sicherungen über eine gespeicherte Prozedur über Dapper auszuführen (der Rest meiner App verwendet Dapper, daher möchte ich, dass dieser Teil auch weiterhin ausgeführt wird). Es funktioniert einwandfrei, bis CommandTimeout aktiviert wird.

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

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

Die einzige mir bekannte CommandTimeout-Einstellung ist in SqlCommand. Gibt es eine Möglichkeit, dies über Dapper einzustellen?

sh-beta
quelle
1
Aus irgendeinem Grund kann ich meine eigene Frage momentan nicht beantworten. Aber es scheint, als hätte c.Execute () nur das benannte Argument "commandTimeout: 0" hinzugefügt.
Sh-Beta

Antworten:

105

Ja, es gibt mehrere Versionen der Execute-Funktion. Einer (oder mehrere) davon enthält die commandTimeout-Parameter:

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

Entnommen aus SqlMapper.cs

jzacharuk
quelle
4
Ich hatte das gleiche Problem, aber mit der Query-Methode, aber die Lösung funktionierte auch dafür, da sie auch einen commandTimeout-Parameter hat.
Jahu
2
@ DrSchizo, warum sollte es nicht verwendet werden, es gibt keinen Grund für Async Await, die Auszeit zu vermeiden
Mrinal Kamboj
1
@DrSchizo Die Dokumente sagen, dass es nicht mit asynchronen Methoden wie BeginExecuteReader verwendet wird, nicht async / await. Ich gehe davon aus, dass bei Verwendung von BeginExecuteReader davon ausgegangen wird, dass Sie Ihre eigene Timeout-Logik verwenden.
jugg1es
2
Ist es möglich, dieses Zeitlimit für alle Abfragen festzulegen? Ich habe es mit dem versucht, SqlConnection.ConnectionTimeout Propertyaber es heißt, dass es schreibgeschützt ist. Ich würde es für einige benutzerdefinierte Migrationsprogramme benötigen. Es ist mühsam, es mit jeder Aussage zu tippen.
Tadej
5
@jedatkinports SqlMapper.Settings.CommandTimeout Ich glaube, das ist, wonach Sie suchen.
Shiv
57

Beispiel aus der ursprünglichen Frage mit akzeptierter Antwort hinzugefügt, falls jemand dies wünscht. (Timeout ist auf 60 Sekunden eingestellt):

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
quelle
1

Es ist nicht erforderlich, das Verbindungszeitlimit für alle Abfragen / Datenbankanrufe festzulegen. Sie können global wie unten festlegen.

Dapper.SqlMapper.Settings.CommandTimeout = 0;

Sie können diese statische Eigenschaft beim Laden der Anwendung oder im Datenbankklassenkonstruktor initialisieren.

Dies hilft beim Entfernen von Duplikaten. Wenn Sie diese später ändern möchten, ändern Sie sie einmal.

Mozart Al Khateeb
quelle
0

Ich konnte mein Problem mithilfe von connection.Query lösen und das Timeout direkt einstellen

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