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

ASP.NET MVC中Dapper检查DynamicParameters是否含指定输出参数

在ASP.NET MVC中检查存储过程输出参数是否存在的方法

问题描述

我在ASP.NET MVC中编写了通用异步方法ExecuteAsync用于调用存储过程,部分存储过程会返回@SP_ID输出参数,部分则不会。当存储过程未返回该参数时,执行response.Ref1 = Convert.ToString(p.Get<int>("@SP_ID"))会抛出**"The given key was not present in the dictionary"**错误,请问如何在调用p.Get<int>()前检查该参数是否存在?

解决方案

方法一:直接使用Contains方法检查参数存在性

如果p是SqlParameterCollection类型,可直接调用其Contains方法判断目标参数是否存在:

if (p.Contains("@SP_ID"))
{
    response.Ref1 = Convert.ToString(p.Get<int>("@SP_ID"));
}
else
{
    // 参数不存在时的默认处理,比如赋值为空字符串
    response.Ref1 = string.Empty;
}

方法二:自定义扩展方法实现TryGetValue逻辑(推荐)

为了让代码更简洁健壮,可以给SqlParameterCollection写一个扩展方法,实现类似TryGetValue的安全取值逻辑:

public static class SqlParameterCollectionExtensions
{
    public static bool TryGetIntParameter(this SqlParameterCollection paramCollection, string paramName, out int result)
    {
        result = default;
        
        // 先检查参数是否存在
        if (!paramCollection.Contains(paramName))
            return false;
            
        var parameter = paramCollection[paramName];
        // 再检查参数值是否为DBNull,避免转换失败
        if (parameter.Value == DBNull.Value)
            return false;
            
        return int.TryParse(parameter.Value.ToString(), out result);
    }
}

调用示例:

if (p.TryGetIntParameter("@SP_ID", out int spId))
{
    response.Ref1 = spId.ToString();
}
else
{
    response.Ref1 = string.Empty;
}

方法三:捕获异常(不推荐)

虽然可以通过捕获KeyNotFoundException来处理,但这种方式属于“异常控制流程”,性能和可读性都不如提前检查,仅适合特殊场景:

try
{
    response.Ref1 = Convert.ToString(p.Get<int>("@SP_ID"));
}
catch (KeyNotFoundException)
{
    response.Ref1 = string.Empty;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:35:22