You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Dapper中全局设置命令超时时间

在Dapper中全局设置命令超时时间(ASP.NET Core 5 MVC)

Dapper本身没有提供直接的全局命令超时配置项,但你可以通过封装扩展方法或统一生成CommandDefinition的方式,一次性给所有查询设置默认超时,避免逐个修改100个仓储类的重复劳动。

方案一:封装自定义Dapper扩展方法

创建一个静态扩展类,封装Dapper常用的查询/执行方法,在内部统一指定commandTimeout参数。后续所有仓储类都使用这些自定义方法,而非Dapper原生方法。

using System.Data;
using Dapper;

public static class DapperGlobalTimeoutExtensions
{
    // 全局默认超时时间(可根据需求调整)
    private const int DefaultCommandTimeout = 30;

    // 封装Query方法
    public static IEnumerable<T> Query<T>(this IDbConnection connection, string sql, object param = null, IDbTransaction transaction = null, bool buffered = true)
    {
        return connection.Query<T>(sql, param, transaction, buffered, commandTimeout: DefaultCommandTimeout);
    }

    // 封装QueryFirstOrDefault方法
    public static T QueryFirstOrDefault<T>(this IDbConnection connection, string sql, object param = null, IDbTransaction transaction = null)
    {
        return connection.QueryFirstOrDefault<T>(sql, param, transaction, commandTimeout: DefaultCommandTimeout);
    }

    // 封装Execute方法
    public static int Execute(this IDbConnection connection, string sql, object param = null, IDbTransaction transaction = null)
    {
        return connection.Execute(sql, param, transaction, commandTimeout: DefaultCommandTimeout);
    }

    // 根据项目需求,继续封装其他需要的Dapper方法(如QuerySingle、ExecuteScalar等)
}

使用方式

在仓储类中引用该扩展类的命名空间,替换原有的Dapper调用:

// 原来的写法(需要手动指定超时)
// var users = _connection.Query<User>("SELECT * FROM Users", commandTimeout: 30);

// 现在的写法(自动使用全局超时)
var users = _connection.Query<User>("SELECT * FROM Users");

后续如果需要调整超时时间,只需修改DefaultCommandTimeout常量即可,无需改动所有仓储类。

方案二:统一生成CommandDefinition

Dapper的多数方法支持传入CommandDefinition对象,你可以创建一个工厂类,统一生成带默认超时的CommandDefinition。

using System.Data;
using Dapper;

public static class CommandDefinitionFactory
{
    private const int DefaultCommandTimeout = 30;

    public static CommandDefinition Create(string sql, object param = null, IDbTransaction transaction = null, CommandType? commandType = null)
    {
        return new CommandDefinition(
            sql: sql,
            parameters: param,
            transaction: transaction,
            commandTimeout: DefaultCommandTimeout,
            commandType: commandType
        );
    }
}

使用方式

在仓储类中通过工厂类生成CommandDefinition,再传给Dapper方法:

var command = CommandDefinitionFactory.Create("SELECT * FROM Users WHERE Id = @Id", new { Id = 1 });
var user = _connection.QueryFirstOrDefault<User>(command);

这种方式适合已经习惯使用CommandDefinition的场景,同样能实现全局超时的统一管理。


内容的提问来源于stack exchange,提问作者Nabeel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:40:08