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

使用Dapper无法获取存储过程输出参数值的问题

Dapper调用存储过程无法获取正确输出参数值的问题

原生ADO.NET实现(可正常返回true)

using(connection= new SqlConnection(connectionString))
{
    using(var cmd = connection.CreateCommand())
    {
        cmd.CommandText= query;
        cmd.CommandType= CommandType.StoredProcedure;
        cmd.CommandTimeout = commandTimeout;

        var pDeviceId = new SqlParameter
        {
            ParameterName = "@DeviceId",
            DbType = DbType.String,
            Size = 150,
            Direction = ParameterDirection.Input,
            Value = parameter.DeviceId
        };
        cmd.Parameters.Add(pDeviceId);

        var pResponse = new SqlParameter
        {
            ParameterName = "@Response",
            DbType = DbType.Boolean,
            Direction = ParameterDirection.Output,
        };
        cmd.Parameters.Add(pResponse);

        await connection.OpenAsync();

        int i = cmd.ExecuteNonQuery();
        var response = (bool)cmd.Parameters["@Response"].Value;

        return response;
    }
}

Dapper错误实现(总是返回false)

using (connection = new SqlConnection(connectionString))
{
    using(var cmd = connection.CreateCommand())
    {
        var parameters = new DynamicParameters();
        parameters.Add("@DeviceId", parameter.DeviceId);
        parameters.Add("@Response", dbType: DbType.Boolean, direction: ParameterDirection.Output);

        var reply = (await connection.QueryAsync<bool>(
            query,
            param: parameters,
            commandType: System.Data.CommandType.StoredProcedure).ConfigureAwait(false)).FirstOrDefault();
        return reply;
    }
}

正确的Dapper实现

问题出在你误用了QueryAsync<bool>——这个方法是用来读取存储过程返回的结果集,而非输出参数。要获取输出参数的值,需执行完成后从DynamicParameters中提取,同时用ExecuteAsync代替QueryAsync(因为该存储过程没有返回结果集):

using (var connection = new SqlConnection(connectionString))
{
    var parameters = new DynamicParameters();
    parameters.Add("@DeviceId", parameter.DeviceId);
    parameters.Add("@Response", dbType: DbType.Boolean, direction: ParameterDirection.Output);

    await connection.ExecuteAsync(
        query,
        param: parameters,
        commandType: CommandType.StoredProcedure).ConfigureAwait(false);

    var reply = parameters.Get<bool>("@Response");
    return reply;
}

核心修正点:

  • 移除不必要的SqlCommand创建,Dapper会自动处理命令对象
  • 用ExecuteAsync执行存储过程:适合无结果集、仅需执行操作或获取输出参数的场景
  • 通过parameters.Get<bool>("@Response")从动态参数中提取输出值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 08:45:20