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:
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:
EF Core - Iniciando com o Entity Framework Core
Core - Usando o EF Core com Windows Forms ...
ASP .NET Core - Acessando dados com Entity ...
EF Core - Conceitos Básicos - Macoratti
EF Core - Usando a abordagem DataBase First ...
EF Core 2.0 - Scaffolding DbContext e Models ...
Curso Entity Framework Core 2.0 - Vídeo Aulas
Usando o EF Core com Windows Forms ...
EF Core - Dicas de desempenho