我在项目中使用 dapper 来调用存储过程。我在我的 api 中设置了以下 post 调用
[HttpPost("{procName}")]
public List<dynamic> RunProcWithParameters(string procName, [FromQuery]Dictionary<string, string> procParameters)
{
var parameters = new DynamicParameters(procParameters);
using var conn = new SqlConnection(_options.Connection);
var result = conn.Query(procName, parameters, commandType: CommandType.StoredProcedure).ToList();
return result;
}
在我的项目中连接 swagger 后,我正在通过传入我的过程名称和参数以及示例调用来测试我的 API,如下所示: https://localhost:7009/StoredProc/MyProcThatIWantToRun?ParameterName=ParameterValue
当我运行此程序时,出现以下错误:
类型的成员Comparer System.Collections.Generic.IEqualityComparer`1[[System.String, System.Private.CoreLib,版本=6.0.0.0,文化=中性, PublicKeyToken=7cec85d7bea7798e]] 不能作为参数值
我尝试将字典更改为Dictionary
我在这方面做错/不理解是什么?
看来字典值到 DynamicParameters 的转换是问题的根源。使用 DynamicParameters 时,会尝试在内部使用 DictionaryStringObjectComparer 进行比较。从错误来看,该比较器不适合您的情况。
您可能需要使用 DynamicParameters 循环浏览字典并一次添加每个参数,而不是一次提供完整的字典作为参数。确保 URL 中的参数也与您保存的方法中预期的参数名称相对应。
[HttpPost("{procName}")]
public List<dynamic> RunProcWithParameters(string procName, [FromQuery]
Dictionary<string, string> procParameters)
{
var parameters = new DynamicParameters();
// Iterate through the dictionary and add each parameter individually
foreach (var kvp in procParameters)
{
parameters.Add(kvp.Key, kvp.Value);
}
using var conn = new SqlConnection(_options.Connection);
var result = conn.Query(procName, parameters, commandType: CommandType.StoredProcedure).ToList();
return result;
}
通过此更改,您可以放心,每个参数都会单独添加到 DynamicParameters 中。此外,请确认值的类型正确,并且 URL 中的参数名称与存储方法的预期参数名称相对应。