在Dapper.NET中调整CommandTimeout?


92

我正在尝试通过Dapper通过存储过程运行SQL备份(我的应用程序的其余部分使用Dapper,因此我也希望通过它运行该部分)。直到CommandTimeout生效,它才能正常工作。

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

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

我知道的唯一CommandTimeout设置在SqlCommand中。有没有一种方法可以通过Dapper进行设置?


1
无论出于什么原因,我现在都无法回答自己的问题。但是似乎只是将命名参数“ commandTimeout:0”添加到c.Execute()即可解决此问题。
sh-beta

Answers:


106

是的,Execute函数有多个版本。其中一个(或多个)包含commandTimeout参数:

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

取自SqlMapper.cs


4
我有同样的问题,但是使用Query方法,但是该解决方案也适用于该方法,因为它也具有commandTimeout参数。
贾胡,2015年

2
@DrSchizo为什么不使用它,没有理由让Async
Await

1
@DrSchizo文档说它不用于异步方法,如BeginExecuteReader,而不是异步/等待。我认为这是因为如果您使用BeginExecuteReader,则假定您将使用自己的超时逻辑。
jugg1es

3
是否可以为所有查询设置此超时?我尝试了,SqlConnection.ConnectionTimeout Property但它说它是只读的。对于某些自定义迁移程序,我将需要它。在每个语句中键入它是很乏味的。
塔德吉

5
@jedatkinports SqlMapper.Settings.CommandTimeout我相信你在追求什么。
Shiv

59

原始问题的示例,并添加了可接受的答案,以防万一。(超时设置为60秒):

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

无需为所有查询/ Db呼叫设置命令超时。您可以像下面这样全局设置。

Dapper.SqlMapper.Settings.CommandTimeout = 0;

您可以在应用程序加载时或在数据库类构造函数中初始化此静态属性。

这有助于删除重复项,并且如果您以后决定更改它,则只需更改一次即可。


0

我可以使用connection.Query直接设置超时来解决我的问题

int timeOutInSeconds = 60;
.
.
.
result = conn.Query<list>(stringQuery, new {parameters, ..}, null, true, timeOutInSeconds).ToList();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.