调用返回整数的过程时,数据读取器有多个字段错误

时间:2015-08-04 00:16:47

标签: c# .net sql-server entity-framework

遇到此错误时,我试图获取存储过程执行的状态代码:

  

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使函数可用,唯一的问题仍然是返回数据读取器的这些神秘字段是什么?

4 个答案:

答案 0 :(得分:7)

Database.SqlQuery<T>()需要某种结果集(例如SELECT)。在引擎盖下,它使用DbCommand.ExecuteReader(),当T是标量时,它期望结果集只有一个字段 - 但如果结果集有多个字段,或者如果没有字段,它会抛出您遇到的异常。

可以通过将DbParameter传递给Database.SqlQuery<T>()并设置Direction = ParameterDirection.ReturnValue来检索返回值,如下例所示:

仅供参考,如果您只想要返回值,但不想要结果集,请将ExecuteSqlCommandDbParameter一起使用。

答案 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中使用之前,请务必注释所有打印件。