The data reader has more than one field error while calling a procedure that returns an integer

14,593

Database.SqlQuery<T>() expects some kind of result set (e.g. SELECT). Under the hood, it uses DbCommand.ExecuteReader(), and when T is scalar, it expects the result set to have exactly one field -- but if the result set has more than one field, or if there are no fields, it throws the exception that you encountered.

The return value can be retrieved by passing a DbParameter to Database.SqlQuery<T>() and setting Direction = ParameterDirection.ReturnValue as seen in these examples:


FYI, if you just want the return value, but you don't want a result set, use ExecuteSqlCommand with a DbParameter.

Share:
14,593
Jyrkka
Author by

Jyrkka

#SOreadytohelp

Updated on July 20, 2022

Comments

  • Jyrkka
    Jyrkka almost 2 years

    I was trying to get status code of a stored procedure execution when encountered this error:

    An exception of type 'System.Data.Entity.Core.EntityCommandExecutionException' occurred in EntityFramework.SqlServer.dll but was not handled in user code

    Additional information: The data reader has more than one field. Multiple fields are not valid for EDM primitive or enumeration types.

    I have rewritten the procedure to do absolutely nothing but to return an integer value, this is how it looks now:

    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
    

    But I still get the same error at run-time when reaching the procedure call at line:

    this.Database.SqlQuery<int>("test @i, @a, @b, @c, @d", p_i, p_a, p_b, p_c, p_d).FirstOrDefault();
    

    Is there anyway to figure out what these fields are, and where they are coming from? And how should I get the returned value?

    I've tried to specify a tuple of two strings as the T just to look into these values, but with no success...

    Updates:
    Select 1 instead of return 1 makes the function usable, the only question remains what are these mysterious fields that are returned to the data reader?

  • Scharly Ochoa
    Scharly Ochoa over 8 years
    when are you getting that error on compile or runtime ? i think it should work. Also try "exec [dbo].[test] {0}, {1}, {2}, {3}, {4}"
  • Jyrkka
    Jyrkka over 8 years
    Have tried also the second one, the error remained the same, I'm getting it at runtime.
  • Jyrkka
    Jyrkka over 8 years
    Well, now the exception is different Error converting data type nvarchar to int.
  • Ramesh Babu
    Ramesh Babu over 8 years
    the statement is right. so check the datatype of the parameters within the stored procedure and the values you are passing to them.
  • Jyrkka
    Jyrkka over 8 years
    I can run the query from the SSMS, thus both the procedure and the values are usable. The only thing I can think of is that you need to put quotes around {1-4}, since @a, @b, @c and @d are nvarchars...
  • Jyrkka
    Jyrkka over 8 years
    Thank you for the explanation about the behind the scenes stuff, but I didn't get the point, the procedure returns exactly one value, I'm not sure that it can be thought of as a field though, but the message says that the reader has more than one field...
  • jjj
    jjj over 8 years
    @Jyrkka: What I mean to say is that when using SqlQuery, it counts fields in the result set, so SELECT x, y, FROM table would have two fields. When T is a scalar, it expects one field, but if there are no fields, it looks like it gives the same error as when there are more than one.