EF Core  - Obtendo o valor de retorno de uma Stored Procedure

 Neste artigo vou mostrar como obter o valor de retorno de uma Stored Procedure no EF Core.

Os procedimentos armazenados do SQL Server podem retornar dados de três maneiras diferentes:

  1. Por meio de Result Sets ou conjuntos de resultados,
  2. Por meio de parâmetros OUTPUT
  3. Por meio de valores RETURN;

Para mais detalhes consulte a documentação aqui: Retorno de dados de um Stored Procedure

Neste artigo vou mostrar como obter o valor de retorno usando a última opção.

Como exemplo eu vou usar o banco de dados Northwind.mdf em um projeto Console do tipo .NET Core no ambiente do .NET 5.0.

Criando e configurando o projeto Console

Crie um projeto Console do tipo .NET Core e a seguir vamos vamos incluir no projeto o pacotes do EF Core.

Para este exemplo vamos precisar incluir apenas o pacote Microsoft.EntityFrameworkCore.SqlServer versão 5.0.1.

Podemos fazer isso usando o comando : dotnet add package Microsoft.EntityFrameworkCore.SqlServe -version 5.0.1

Podemos também fazer isso via menu Tools ..->Manage Nuget Packages for solution e usar a guia Browse informando o nome do pacote.

A seguir crie uma pasta Models no projeto e nesta pasta crie a classe de contexto NorthwindContext que vai herdar de DbContext:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.Extensions.Logging;
using System;
namespace EFCore5_Logging1.Models
{
    public class NorthwindContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder
                .UseSqlServer(@"Data Source=desktop-***\sqlexpress;Initial Catalog=Northwind;Integrated Security=True");
        }
    }
}

No arquivo de contexto estamos definindo no método OnConfiguring o provedor para o SQL Server e a string de conexão com o banco de dados Northwind.

Agora para exibir o log no console podemos usa método LogTo() conforme mostrado a seguir:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.Extensions.Logging;
using System;
namespace EFCore5_Logging1.Models
{
    public class NorthwindContext : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
           optionsBuilder
          .LogTo(Console.WriteLine)
          .UseSqlServer(@"Data Source=desktop-bhp8771\sqlexpress;Initial Catalog=Northwind;Integrated Security=True");
        }
    }
}

Agora vamos abrir o banco de dados Northwind no SQL Server Management Studio e criar uma stored procedure bem simples usando o código a seguir:

CREATE PROCEDURE [dbo].[FelizAnoNovo]
AS
Begin
     return 2021
End
Go

Criamos uma stored procedure chamada FelizAnoNovo que retorna o valor 2021.

Agora para obter o valor de retorno deste procedimento armazenado vamos incluir o código abaixo no arquivo Program:

using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using static System.Console;
namespace EFCore5_Logging1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var parameterReturn = new SqlParameter
            {
                ParameterName = "ReturnValue",
                SqlDbType = System.Data.SqlDbType.Int,
                Direction = System.Data.ParameterDirection.Output,
            };
            using (var db = new Models.NorthwindContext())
            {
                var result = db.Database
                            .ExecuteSqlRaw("EXEC @returnValue = [dbo].[FelizAnoNovo]", parameterReturn);
                int returnValue = (int)parameterReturn.Value;
                WriteLine($"valor de retorno da Stored Procedure : {returnValue}");
            }
            ReadLine();
        }
    }
}

Neste código definimos um parâmetro para manter o valor RETURN - observe que a direção está definida para "Output" (apesar da presença de um valor Enum de direção do parâmetro "ReturnValue")

A seguir executamos o procedimento armazenado e exibimos o resultado, e, como nenhum conjunto de resultados é retornado, podemos usar ExecuteSqlRaw.

Se houvesse um conjunto de resultados, FromSqlRaw poderia ter sido usado. É usada uma sintaxe especial para a chamada EXEC, que atribui o valor de retorno ao parâmetro @returnValue.

Observe que o parameterReturn.Value é do tipo "objeto" e deve ser convertido no tipo desejado, no caso para int.

Executando o projeto iremos obter o resultado abaixo:

E estamos conversados...

"Se esperamos em Cristo só nesta vida, somos os mais miseráveis de todos os homens."
1 Coríntios 15:19

Referências:


José Carlos Macoratti