C# 从SqlQuery数据读取器问题执行存储过程

C# 从SqlQuery数据读取器问题执行存储过程,c#,sql-server,C#,Sql Server,因此,我尝试执行以下存储过程 String sql = "SET NOCOUNT ON; " + "DECLARE @id INT, @itemnumber nvarchar(20); " + "SELECT @id= '" + car.ID + "'" + "EXEC [file].[usp_iudCar] " + "@p_ID=@id OUTPUT," + "@p_Loca

因此,我尝试执行以下存储过程

            String sql =
        "SET NOCOUNT ON; " +
        "DECLARE @id INT, @itemnumber nvarchar(20); " +
        "SELECT @id= '" + car.ID + "'" +
        "EXEC [file].[usp_iudCar] " +
        "@p_ID=@id OUTPUT," +
        "@p_Location= '" + location + "', " +
        "@p_ItemNumber=@itemnumber OUTPUT, " +
        "@p_DoerTicket= '" + userToken + "' " +
        "SELECT @id AS id, @itemnumber AS itemNumber; ";

            QueryParamCollection queryParams = new QueryParamCollection();
            queryParams.AddInt32Param(QueryParamName.CarID, (object)car.ID);
            queryParams.AddStringParam(QueryParamName.Location, (object)location);
            queryParams.AddStringParam(QueryParamName.DoerTicket, (object)userToken);

            var update = context.Database.SqlQuery<Int32>(sql).FirstOrDefault<Int32>();

            return update;
结果集

但我得到了一个执行权

“ExceptionMessage”:“数据读取器有多个字段。多个字段对EDM基元或枚举类型无效。”

那么我该如何解决这个问题,或者正确的方法是什么?

此错误:

“ExceptionMessage”:“数据读取器有多个字段。多个字段对EDM基元或枚举类型无效。”

意味着存储过程返回的字段不止一个。这就是你要告诉EF的:

var update = context.Database.SqlQuery<Int32>(sql).FirstOrDefault<Int32>();
var update=context.Database.SqlQuery(sql).FirstOrDefault();
查询返回单个字段,但显然不是这样,否则您将不会得到该错误


另外,这不是如何使用EF数据库优先方法调用存储过程。请参考问题和公认的答案,了解如何以正确的方式做您想做的事情

我可以看出一个明显错误的地方是您没有定义
@itemnumber
变量的长度,您使用的数据类型
nvarchar
没有任何特定的长度,sql server将默认为
nvarchar(1)
。是的,我知道我忘记了这一点,但它仍然会给我同样的错误。我强烈建议不要使用存储过程,因为它们不太容易测试。如果您可以选择使用EF,我建议您改用EF。我曾尝试查看EF是否是一个选项,但遗憾的是,这不是由于此数据库结构的原因。您的调用希望结果集中有一列,可转换为
Int32
。您将给它一个包含两列的结果集。这与调用存储过程的事实完全无关。更简单的复制:
选择1作为A,选择2作为B
。问题是我没有任何选项可以在edmx@ominidata为什么不呢?为什么你没有这个选择呢?我们两个人一直在试图找出原因,我们的结论是这个数据库的结构是这样的on@ominidata好的,你怎么做取决于你自己。您可以自己创建一个与存储过程返回的结果一致的类型,并使用它代替
Int32
。存储过程在任何情况下都必须返回准确的类型,否则它将再次中断。
var update = context.Database.SqlQuery<Int32>(sql).FirstOrDefault<Int32>();