Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 首先在实体框架代码中使用输出参数调用存储过程时出错_C#_Sql Server_Entity Framework_Stored Procedures_Ef Code First - Fatal编程技术网

C# 首先在实体框架代码中使用输出参数调用存储过程时出错

C# 首先在实体框架代码中使用输出参数调用存储过程时出错,c#,sql-server,entity-framework,stored-procedures,ef-code-first,C#,Sql Server,Entity Framework,Stored Procedures,Ef Code First,在使用代码优先方法从实体框架调用ExecuteStoreQuery时,我遇到以下错误 数据读取器有多个字段。多个字段对于EDM基元或枚举类型无效 但我的插入/更新操作反映在数据库中 你知道这个问题吗 这是来自c的代码 long Id=0; SqlParameter paramoutput = new SqlParameter() { ParameterName = "Result", Value = "", SqlDbType = System.Data.SqlDbType.

在使用代码优先方法从实体框架调用ExecuteStoreQuery时,我遇到以下错误

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

但我的插入/更新操作反映在数据库中

你知道这个问题吗

这是来自c的代码

long Id=0;

SqlParameter paramoutput = new SqlParameter()
{
   ParameterName = "Result",
   Value = "",
   SqlDbType = System.Data.SqlDbType.BigInt,
   Size = 100,
   Direction = System.Data.ParameterDirection.Output
};

var mydata = (dataContext as IObjectContextAdapter).ObjectContext
             .ExecuteStoreQuery<long>("exec Save @MarkupId, @ApiId, @MainBranchId, @Title, @Markup, @IsPercentage, @IsDomestic, @CreatedOn, @CreatedBy, @ModifiedOn, @ModifiedBy, @IsActive, @Result out",
                 new SqlParameter("@MarkupId", generalMarkupModel.Id),
                 new SqlParameter("@ApiId", generalMarkupModel.ApiId),
                 new SqlParameter("@MainBranchId", generalMarkupModel.MainBranchId),
                 new SqlParameter("@Title", generalMarkupModel.Title),
                 new SqlParameter("@Markup", generalMarkupModel.Markup),
                 new SqlParameter("@IsPercentage", generalMarkupModel.IsPercentage),
                 new SqlParameter("@IsDomestic", generalMarkupModel.IsDomestic),
                 new SqlParameter("@IsActive", generalMarkupModel.IsActive),
                 new SqlParameter("@CreatedOn", DateTime.Now),
                 new SqlParameter("@CreatedBy", "ajc"),
                 new SqlParameter("@ModifiedOn", DateTime.Now),
                 new SqlParameter("@ModifiedBy", "ajm"),
                 paramoutput);

Id = Convert.ToInt64(paramoutput.Value.ToString());
return Id;

首先,您的过程没有选择任何结果。因此,由于指定了long类型的返回结果集,因此需要选择一些内容。因此,更改进程的最后一行:

-- instead of select @Result=@@IDENTITY 
-- use these lines:
SET @Result = @@IDENTITY
SELECT @Result Result 
现在,您可以通过过程调用获得所选的值。意味着当您执行方法时,您将从result中获得新的id作为mydata参数,该参数应该被迭代

但还是有一个bug。您将无法使用此线路:

Id = Convert.ToInt64(paramoutput.Value.ToString());
因为您的输出参数没有值,所以它是null,除非您迭代查询结果。表示paramoutput。在对查询调用一个迭代器方法之前,该值将为null。因此:

SqlParameter paramoutput = new SqlParameter()
{
   ParameterName = "Result",
   // Value = "", no need
   SqlDbType = System.Data.SqlDbType.BigInt,
   // Size = 100, no need
   Direction = System.Data.ParameterDirection.Output
};

var mydata = (dataContext as IObjectContextAdapter).ObjectContext
             .ExecuteStoreQuery<long>("exec Save @MarkupId, @ApiId, @MainBranchId, @Title, @Markup, @IsPercentage, @IsDomestic, @CreatedOn, @CreatedBy, @ModifiedOn, @ModifiedBy, @IsActive, @Result out",
                 new SqlParameter("@MarkupId", generalMarkupModel.Id),
                 new SqlParameter("@ApiId", generalMarkupModel.ApiId),
                 new SqlParameter("@MainBranchId", generalMarkupModel.MainBranchId),
                 new SqlParameter("@Title", generalMarkupModel.Title),
                 new SqlParameter("@Markup", generalMarkupModel.Markup),
                 new SqlParameter("@IsPercentage", generalMarkupModel.IsPercentage),
                 new SqlParameter("@IsDomestic", generalMarkupModel.IsDomestic),
                 new SqlParameter("@IsActive", generalMarkupModel.IsActive),
                 new SqlParameter("@CreatedOn", DateTime.Now),
                 new SqlParameter("@CreatedBy", "ajc"),
                 new SqlParameter("@ModifiedOn", DateTime.Now),
                 new SqlParameter("@ModifiedBy", "ajm"),
                 paramoutput);

// here, the mydata, is of type ObjectResult<long> which you should iterate it to get underlying IDataReader iterated and closed. Then you can use output parameters. So, add this line:
var returnedId = mydata.FirstOrDefault();
// now, the output parameter is available:
Id = Convert.ToInt64(paramoutput.Value.ToString());
请考虑我对代码和新行添加的注释。< /P>
毕竟,为什么要传递输出参数并选择相同的结果呢?其中一个应该做这项工作,另一个是多余的。不是吗?还是有些东西我看不见?

邮政编码!我不知道你在说什么。您需要发布给出错误的代码,我们可能会帮助您。我们还需要存储的进程。我建议使用SCOPE_IDENTITY而不是其他任何东西来获取新插入的标识值。它是一个存储过程——就像存储在SQL Server中的过程一样。这不是一个存储过程与存储无关,也不是一个英语中根本不存在的单词storeprocedure
SqlParameter paramoutput = new SqlParameter()
{
   ParameterName = "Result",
   // Value = "", no need
   SqlDbType = System.Data.SqlDbType.BigInt,
   // Size = 100, no need
   Direction = System.Data.ParameterDirection.Output
};

var mydata = (dataContext as IObjectContextAdapter).ObjectContext
             .ExecuteStoreQuery<long>("exec Save @MarkupId, @ApiId, @MainBranchId, @Title, @Markup, @IsPercentage, @IsDomestic, @CreatedOn, @CreatedBy, @ModifiedOn, @ModifiedBy, @IsActive, @Result out",
                 new SqlParameter("@MarkupId", generalMarkupModel.Id),
                 new SqlParameter("@ApiId", generalMarkupModel.ApiId),
                 new SqlParameter("@MainBranchId", generalMarkupModel.MainBranchId),
                 new SqlParameter("@Title", generalMarkupModel.Title),
                 new SqlParameter("@Markup", generalMarkupModel.Markup),
                 new SqlParameter("@IsPercentage", generalMarkupModel.IsPercentage),
                 new SqlParameter("@IsDomestic", generalMarkupModel.IsDomestic),
                 new SqlParameter("@IsActive", generalMarkupModel.IsActive),
                 new SqlParameter("@CreatedOn", DateTime.Now),
                 new SqlParameter("@CreatedBy", "ajc"),
                 new SqlParameter("@ModifiedOn", DateTime.Now),
                 new SqlParameter("@ModifiedBy", "ajm"),
                 paramoutput);

// here, the mydata, is of type ObjectResult<long> which you should iterate it to get underlying IDataReader iterated and closed. Then you can use output parameters. So, add this line:
var returnedId = mydata.FirstOrDefault();
// now, the output parameter is available:
Id = Convert.ToInt64(paramoutput.Value.ToString());