调用存储过程插入数据并返回输出参数时遇类型映射错误,求正确调用方式
问题分析与解决方法
嘿,我一眼就看到问题所在了!你遇到的报错:
No mapping exists from object type System.Collections.Generic.List`1
根源是输出参数的添加方式错误,同时调用存储过程的命令文本也漏了输出参数的声明。咱们一步步理清楚:
错误的核心原因
你先正确创建了输出参数对象outputParameter,但后续却多做了一步画蛇添足的操作:
parameters.Add(new SqlParameter("@Confirm", outputParameter));
这里你把已经配置好的outputParameter作为参数值传给了一个新的SqlParameter,这就导致EF试图把SqlParameter类型的对象映射到SQL参数,自然无法识别,抛出类型映射错误。
另外,你的存储过程调用命令里没有声明输出参数,存储过程需要接收@Confirm作为输出参数,但你只写了exec TestProc @Parameter1, @Parameter2,SQL Server不知道要处理这个输出参数。
修正后的代码
using (Entities ent = new Entities()) { List<SqlParameter> parameters = new List<SqlParameter>(); parameters.Add(new SqlParameter("@Parameter1", "Parameter1")); parameters.Add(new SqlParameter("@Parameter2", "Parameter2")); // 正确创建并配置输出参数,直接添加到参数列表 SqlParameter outputParameter = new SqlParameter(); outputParameter.ParameterName = "@Confirm"; outputParameter.SqlDbType = System.Data.SqlDbType.Bit; outputParameter.Direction = System.Data.ParameterDirection.Output; parameters.Add(outputParameter); // 直接添加,不需要再包装 // 命令文本里要声明输出参数 ent.Database.ExecuteSqlCommand("exec TestProc @Parameter1, @Parameter2, @Confirm output", parameters); bool success = Convert.ToBoolean(outputParameter.Value); }
关键注意点
- 输出参数配置完成后,直接加入参数列表即可,不要用它作为值创建新的SqlParameter
- 调用存储过程的SQL语句中,必须给输出参数加上
output关键字,告知SQL Server这是一个输出参数 - 确保存储过程的参数顺序和你传入的参数顺序一致,或者可以用命名参数的方式(比如
exec TestProc @Parameter1=@Parameter1, @Parameter2=@Parameter2, @Confirm=@Confirm output),这样更不容易出错
内容的提问来源于stack exchange,提问作者Lio Programista
相关产品推荐
相关产品推荐

