Executando Stored Procedures com .NET 6, SQL Server e Dapper

A tarefa de executar stored procedures é bem comum em projetos de todos tamanhos. Em alguns casos, projetos inteiros foram desenvolvidos baseados apenas nesse recurso do SQL Server, enquanto em outros algumas lógicas envolvendo fluxos com funções do SQL, tabelas temporárias e JOINs complexas foram transferidas para o banco de dados. Isso ocorre por diversos motivos, seja por maior expertise em SQL Server na equipe, comodidade em relação ao que já se tem pronto, ou mesmo por performance.

Neste artigo vou mostrar como executar Stored Procedures em uma aplicação Console .NET 6 usando o Dapper. Vamos lá?

Código-fonte aqui, junto com scripts SQL.

Criando a estrutura de tabelas

Antes de se falar em Stored Procedure, vou disponibilizar logo abaixo um script SQL onde é criado o banco de dados Sales, a tabela tb_Boletos, e realizar a inserção de um simples registro de boleto. Essa estrutura será utilizada para a execução de uma stored procedure que vai marcar o boleto com o status PAGO e atualizar sua data de pagamento.

Script Estrutura de Banco de Dados, Tabela e Insert

Criando a Stored Procedure

Para o exemplo, vou disponibilizar logo abaixo o script SQL de criação da Stored Procedure de atualização de status do boleto pago, recebendo como parâmetros o Id e Data de Pagamento do boleto.

Script Criação de Stored Procedure

Executando uma Stored Procedure com Dapper

Finalmente, chegou a hora de executar a Stored Procedure utilizando o Dapper.

Para isso, utilizaremos um projeto simples de tipo Console, que pode ser criado através do comando abaixo, navegando para a página do projeto recém criado com a linha de comando em seguida.

dotnet new console -o ArtigoDapperExemplo

Além disso, precisamos instalar 2 pacotes: System.Data.SqlClient e Dapper. Isso pode ser feito com o comando abaixo, utilizando a .NET CLI.

dotnet add package System.Data.SqlClient
dotnet add package Dapper

Com os pacotes instalados, podemos executar a Stored Procedure através do método Execute do Dapper a partir do IDbConnection, passando como parâmetros o nome da Stored Procedure, os parâmetros através de um objeto anônimo, e finalmente o tipo do comando. Como não esperamos algum resultado, o Execute pode ser utilizado aqui. Caso espere algum retorno da Stored Procedure, o método Query pode ser utilizado.

using System.Data;
using System.Data.SqlClient;
using Dapper;

using (IDbConnection db = new SqlConnection("Server=localhost; Database=Sales; User Id=sa; Password=MyPass@word")) {
    const int id = 1;

    db.Execute("spMarcarBoletoComoPago", new { id, data_pagamento = DateTime.Now }, commandType: CommandType.StoredProcedure);
}

Console.WriteLine("Boleto marcado como pago.");

Lembrar que a cadeia de conexão do banco de dados vai mudar de acordo com a instância instalada do SQL Server. No meu caso, utilizo uma instância do Azure SQL Edge iniciada com o Docker, em um MacBook Pro com chip M1.

Com o código implementado e a estrutura do banco de dados criada, basta executar a aplicação uma vez que tanto o status quanto a data de pagamento serão atualizados.

Conclusão

Neste artigo foi mostrado como executar uma Stored Procedure de maneira prática utilizando o Dapper, atualizando registro em uma tabela existente em uma aplicação .NET 6.