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
相关产品推荐
相关产品推荐

