在 Dapper.NET 中调整 CommandTimeout?

Posted

技术标签:

【中文标题】在 Dapper.NET 中调整 CommandTimeout?【英文标题】:Adjusting CommandTimeout in Dapper.NET? 【发布时间】:2012-02-06 08:49:44 【问题描述】:

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

【问题讨论】:

不知什么原因,我现在无法回答我自己的问题。但似乎只是将命名参数“commandTimeout:0”添加到 c.Execute() 就可以解决这个问题。 【参考方案1】:

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

【讨论】:

我遇到了同样的问题,但是使用 Query 方法,但是解决方案也适用,因为它也有一个 commandTimeout 参数。 @DrSchizo 为什么不使用它,Async Await 没有理由避免超时 @DrSchizo 文档说它不与 BeginExecuteReader 等异步方法一起使用,而不是 async/await。我认为这是因为如果您使用 BeginExecuteReader,则假定您将使用自己的超时逻辑。 是否可以为所有查询设置此超时?我尝试使用SqlConnection.ConnectionTimeout Property,但它说它是只读的。对于一些自定义迁移程序,我需要它。每个语句都输入它很乏味。 @jedatkinports SqlMapper.Settings.CommandTimeout 我相信这就是你所追求的。【参考方案2】:

添加已接受答案的原始问题示例,以防有人需要。 (超时设置为 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);

【讨论】:

【参考方案3】:

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

Dapper.SqlMapper.Settings.CommandTimeout = 0;

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

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

【讨论】:

【参考方案4】:

我能够使用 connection.Query 解决我的问题 直接设置超时时间

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

【讨论】:

以上是关于在 Dapper.NET 中调整 CommandTimeout?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Dapper.NET 中使用事务?

dapper.net,如何刷新 ConcurrentDictionary?

Dapper.net 的奇怪超时问题

Dapper.NET——轻量ORM

如何在Dapper.Net中编写一对多查询?

使用Dapper.NET异步API时如何尊重CommandTimeout