遇到此错误时,我试图获取存储过程执行的状态代码:
EntityFramework.SqlServer.dll中发生了'System.Data.Entity.Core.EntityCommandExecutionException'类型的异常,但未在用户代码中处理
附加信息:数据阅读器有多个字段。多个字段对EDM原语或枚举类型无效。
我已经重写了程序,除了返回一个整数值之外什么都不做,这就是它现在的样子:
ALTER Procedure [dbo].[test]
(
@i int,
@a nvarchar(max),
@b nvarchar(max),
@c nvarchar(max),
@d nvarchar(max)
)
As
Begin
SET NOCOUNT ON
return 1
End
但是在线路上到达过程调用时,我仍然在运行时得到相同的错误:
this.Database.SqlQuery<int>("test @i, @a, @b, @c, @d", p_i, p_a, p_b, p_c, p_d).FirstOrDefault();
无论如何都要弄清楚这些领域是什么,以及它们来自哪里?我该如何获得返回值?
我试图将两个字符串的元组指定为T
只是为了查看这些值,但没有成功......
更新
Select 1
代替return 1
使函数可用,唯一的问题仍然是返回数据读取器的这些神秘字段是什么?
答案 0 :(得分:7)
Database.SqlQuery<T>()
需要某种结果集(例如SELECT
)。在引擎盖下,它使用DbCommand.ExecuteReader()
,当T
是标量时,它期望结果集只有一个字段 - 但如果结果集有多个字段,或者如果没有字段,它会抛出您遇到的异常。
可以通过将DbParameter
传递给Database.SqlQuery<T>()
并设置Direction = ParameterDirection.ReturnValue
来检索返回值,如下例所示:
仅供参考,如果您只想要返回值,但不想要结果集,请将ExecuteSqlCommand
与DbParameter
一起使用。
答案 1 :(得分:0)
试试这个
var result = this.Database.SqlQuery<int>("exec test {0}, {1}, {2}, {3}, {4}", p_i, p_a, p_b, p_c, p_d).FirstOrDefault();
答案 2 :(得分:0)
我认为查理给出的答案是正确的。但是你必须按如下方式编写代码。
var result = this.Database.SqlQuery<int>(string.Format("exec test {0}, {1}, {2}, {3}, {4}", p_i, p_a, p_b, p_c, p_d)).FirstOrDefault();
答案 3 :(得分:0)
我遇到了类似的情况,我从EF调用了一个程序,程序有一些打印语句,EF因为将所有打印作为输出读取而感到困惑。在EF中使用之前,请务必注释所有打印件。