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>();