Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Sql server 使用EntityFramework Core调用MSSQL StoredProcess并显示返回的数据--_Sql Server_Entity Framework_Entity Framework Core_Asp.net Core Webapi_Entity Framework Migrations - Fatal编程技术网

Sql server 使用EntityFramework Core调用MSSQL StoredProcess并显示返回的数据--

Sql server 使用EntityFramework Core调用MSSQL StoredProcess并显示返回的数据--,sql-server,entity-framework,entity-framework-core,asp.net-core-webapi,entity-framework-migrations,Sql Server,Entity Framework,Entity Framework Core,Asp.net Core Webapi,Entity Framework Migrations,这个问题是不言自明的。因此,我不会对其进行不必要的扩展。 这是我的SP-- 如您所见,SP基本上只返回一个计算值。它没有映射到我的应用程序中的任何实体对象/类。 我编写的后端web api端的C#代码-- 我不知道它又回来了什么垃圾。可能是因为它没有映射到实体类对象。我明白。也许有些C代码也错了。我也不需要单独上课。这只是一个值!如果我添加一个类,我可能也需要进行迁移,这在我的场景中是不必要的。 仅供参考,这也是我的migration builder类,我在“Up”和“Down”中添加了我的sq

这个问题是不言自明的。因此,我不会对其进行不必要的扩展。 这是我的SP--

如您所见,SP基本上只返回一个计算值。它没有映射到我的应用程序中的任何实体对象/类。 我编写的后端web api端的C#代码--

我不知道它又回来了什么垃圾。可能是因为它没有映射到实体类对象。我明白。也许有些C代码也错了。我也不需要单独上课。这只是一个值!如果我添加一个类,我可能也需要进行迁移,这在我的场景中是不必要的。 仅供参考,这也是我的migration builder类,我在“Up”和“Down”中添加了我的sql代码--

我不知道该怎么办。当然,我错过了一些好的技巧或一些黑客在这里将做这件事。这是怎么一回事?我可以创建某种虚拟/抽象实体,只在EF Core中使用它来获取数据,而不是创建表、向数据库添加迁移等吗?还有什么其他选择? 我期待在这方面得到一些好的帮助。
谢谢大家,

您必须使用输出参数代替返回值,如下代码所示

var outputParam = new SqlParameter("outputParam", SqlDbType.Int) { Direction = ParameterDirection.Output };
await _databaseContext.Database.ExecuteSqlCommand($"EXEC {storedProcedureName} @param1, @outputParam output", new SqlParameter("param1"), outputParam);
要获取该值,需要在上述两行之后调用
outputParam.value


ExecuteSqlCommand()
的返回值是一个整数,即受查询影响的记录数。

决不能通过存储过程返回值返回数据。这是一个古老的机制,只用来表示成功或失败。使用输出参数或结果集。或者使用函数而不是存储过程。ok@DavidBrowne Microsoft让我更新SP的代码列表。更改它。对于这个问题,在我可能这样做之后,下一步怎么办?敬请建议,@DavidBrowne Microsoft我更新了dmy SP,现在正在使用输出参数。但正如另一位评论员所指出的,使用ExecuteSqlCommand,我只获取行数,而不获取输出参数值。我该怎么办?我需要SP返回的值。在ExecuteSqlCommand之后,检查
outputparam.value
@DavidBrowne Microsoft okk的值,让我检查一下;我明白了,谢谢@vivek nuna的回复;让我更新代码块并检查响应;我已经更新了SP。它现在将varSale作为输出返回。但是我如何得到这个值呢?因为ExecuteSqlCommand没有给我。它给出了行数,比如4行,7行等等。不是输出的那个值。您需要如何将这个输出参数传递给SP,正如我在示例代码中所做的那样;Value提供SP返回的值。
[Route("TotalSalesByCustomerID")]
    [HttpPost]
    public JsonResult TotalSalesByCustomerID([FromBody]string customer_id)
    {
        try
        {
            //var salesT = (_appDbContext.Totals.FromSql("call sp_TotalSalesByCustomerID(@customer_id)", customer_id));
            var salesT= _appDbContext.Database.ExecuteSqlCommand("sp_TotalSalesByCustomerID @p0", parameters: new[] { customer_id });
            return Json(salesT);
        }
        catch(Exception exp)
        {
            return Json(exp.GetBaseException());
        }
    }
protected override void Up(MigrationBuilder migrationBuilder)
    {
        var sp = @"CREATE procedure [dbo].[sp_TotalSalesByCustomerID]
                    @customer_id nvarchar(50),
                    @varSale decimal OUTPUT  
                    as

                    begin

                    begin try

                    if exists (
                                Select * from tempdb..sysobjects Where id = object_id('tempdb.dbo.#temp')
                              )
                            DROP TABLE #temp

                    else

                            select * into #temp from Orders where customer_id=@customer_id

                            select @varSale=SUM(total_price) from #temp

                    end try

                    begin catch
                        select error_message(),
                               error_severity(),
                               error_number(),
                               error_state()    
                    end catch

                    end";

        migrationBuilder.Sql(sp);
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        var sp = @"CREATE procedure [dbo].[sp_TotalSalesByCustomerID]
                    @customer_id nvarchar(50),
                    @varSale decimal OUTPUT  
                    as

                    begin

                    begin try

                    if exists (
                                Select * from tempdb..sysobjects Where id = object_id('tempdb.dbo.#temp')
                              )
                            DROP TABLE #temp

                    else

                            select * into #temp from Orders where customer_id=@customer_id

                            select @varSale=SUM(total_price) from #temp

                    end try

                    begin catch
                        select error_message(),
                               error_severity(),
                               error_number(),
                               error_state()    
                    end catch

                    end";

        migrationBuilder.Sql(sp);
    }
var outputParam = new SqlParameter("outputParam", SqlDbType.Int) { Direction = ParameterDirection.Output };
await _databaseContext.Database.ExecuteSqlCommand($"EXEC {storedProcedureName} @param1, @outputParam output", new SqlParameter("param1"), outputParam);