113

我正在尝试通过 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 进行设置?

4

4 回答 4

122

是的,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

于 2012-01-09T21:22:44.853 回答
66

添加接受答案的原始问题示例,以防有人需要。(超时设置为 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);
}
于 2015-08-13T18:38:40.953 回答
38

无需为所有查询/数据库调用设置命令超时。您可以像下面这样全局设置它。

Dapper.SqlMapper.Settings.CommandTimeout = 0;

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

这有助于消除重复,如果您决定稍后更改它,您可以在一个地方更改一次。

于 2020-06-30T10:25:47.643 回答
3

我能够使用连接解决我的问题。直接查询设置超时

int timeOutInSeconds = 60;
.
.
.
result = conn.Query<list>(stringQuery, new {parameters, ..}, null, true, timeOutInSeconds).ToList();
于 2020-07-03T19:19:11.957 回答