c# - Entity Framework Core 3.1 从存储过程返回值 (int)

标签 c# sql-server entity-framework-core-3.1

这返回-1,我如何从存储过程中获取实际返回值?

这是我的存储过程

ALTER PROCEDURE [Production].[Select_TicketQuantity]
    @Ticket NVARCHAR(25),
    @Reference NVARCHAR(20)
AS
BEGIN

    declare @SQL nvarchar (4000)
    SET @SQL = 'select QARTCOL as Quantidade from D805DATPOR.GCARCCR1 where NCOLGIA = ' + @Ticket + ' AND NARTCOM = ''' + @Reference + ''''
    SET @SQL = N'select CONVERT(int,Quantidade) as Quantidade from OpenQuery(MACPAC, ''' + REPLACE(@SQL, '''', '''''') + ''')'
    PRINT @SQL
    EXEC (@SQL)

END   

C# 代码
int? quantity= 0;
try
{
    quantity= await _context.Database.ExecuteSqlRawAsync("EXEC Production.Select_TicketQuantity @p0, @p1", parameters: new[] { ticket, reference});
}
catch (Exception ex)
{
    _logger.LogError($"{ex}");
    return RedirectToPage("Index");
}

最佳答案

ExecuteSqlRawAsync返回 the number of rows affected用于插入、更新和删除(-1 用于选择)。

如果您不想更改您的 SP 以引入 output parameter您可以使用 SqlCommand . SqlCommand.ExecuteScalar()返回 The first column of the first row in the result set :

using (var cmd = _context.Database.GetDbConnection().CreateCommand()) {
    cmd.CommandText = "[Production].[Select_TicketQuantity]";
    cmd.CommandType = System.Data.CommandType.StoredProcedure;
    if (cmd.Connection.State != System.Data.ConnectionState.Open) cmd.Connection.Open();
    cmd.Parameters.Add(new SqlParameter("Ticket", ticket));
    cmd.Parameters.Add(new SqlParameter("Reference", reference));
    quantity = (int)cmd.ExecuteScalar();
}

关于c# - Entity Framework Core 3.1 从存储过程返回值 (int),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59624695/

相关文章:

c# - 使用 include Entity Framework core 3.1 时如何过滤嵌套对象

.net-core - 尽管没有进行任何更改,但为什么 EF Core 在每次迁移时都会更新种子 bool 字段?

c# - Entity Framework 包括 Where

sql - 根据聚合值选择单个记录

c# - MS Access、SQL Server 图像字段

java - 无法使用 java 连接到 godaddy MySQL

c# - 带有 div id 的 RedirectToAction() 语法?

c# - 如何使用 JMeter 调用 WCF 服务?

c# - 如何检测 CI 构建中的 WCF 重大更改