Facebook Pixel
Acessando Dados com ADO.NET no .NET Core

Acessando Dados com ADO.NET no .NET Core

Este artigo é parte da série:

Em primeiro lugar, tenha em mente que o .NET Core não traz a biblioteca SQLClient instalada por padrão. Então, primeiro passo é intalá-la a partir do NuGet.

Pesquise por “sqlclient” e instale “Microsoft.Data.SqlClient”.

No SQL Server, crie um banco de dados e uma tabela. Para fins deste exemplo, criei um novo database com o nome “Treino01” e uma tabela “Capitais” de acordo com o model que estamos usando nos exercícios anteriores.

USE [Treino01]
GO

/****** Object:  Table [dbo].[Capitais]    Script Date: 16/11/2024 09:46:09 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[Capitais](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[UF] [char](2) NOT NULL,
	[Capital] [varchar](50) NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Capitais] ADD  CONSTRAINT [DF_Capitais_UF]  DEFAULT ('') FOR [UF]
GO

ALTER TABLE [dbo].[Capitais] ADD  CONSTRAINT [DF_Capitais_Capital]  DEFAULT ('') FOR [Capital]
GO
               
INSERT INTO Capitais (UF, Capital) 
VALUES ('RJ','Rio de Janeiro'),
       ('SP','São Paulo'),
       ('BA','Salvador')

Para esta etapa do projeto, vamos criar um novo controller, chamado “ADOMetodoController” na pasta “Controllers”. Atente-se ao detalhe que é uma “API Controlller” e não “MVC Controller” conforme vem no padrão.

    [Route("api/[controller]")]

E vamos começar colocando um nome na nova rota. Neste exercício, vamos chamar de “ADO”.

    [Route("api/ADO")]

Caso você tenha chegado nesta página agora, saiba que este exercício é uma continuação, então para entender o que está acontecendo, volte para o exercício anterior:

Agora vamos copiar para “ADO” toda a estrutura que fizemos em “Dados” e substituir todas as designações “Dados” para “ADO” para evitar conflito na hora de compilar o programa. Então vamos implementar as modificações para fazer o acesso aos dados.

Segue o código com os métodos já implementados:

using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Configuration;
using System.Data;
using System.Security.Cryptography;
using Treino_REST_02.Models;

namespace Treino_REST_02.Controllers
{
    /// <summary>
    /// Operações CRUD utilizando ADO.NET.
    /// </summary>
    [Route("api/ADO")]
    [ApiController]
    public class ADOMetodoController : ControllerBase
    {
        IConfiguration Config;
        public List<UF> UFs = new List<UF>();
        SqlConnection Cn = new SqlConnection();
        SqlCommand Cm = new SqlCommand();
        SqlDataAdapter DaG = new SqlDataAdapter();

        /// <summary>
        /// Construtor - Inicia os objetos de acesso a dados
        /// </summary>
        /// <param name="_config"></param>
        public ADOMetodoController(IConfiguration _configuration)
        {
            Config = _configuration;
            Cn.ConnectionString = Config.GetConnectionString("cnMain");
            Cm.Connection = Cn;
            DaG.SelectCommand = Cm;
        }


        /// <summary>
        /// Relação de todas as UFs com suas capitais
        /// </summary>
        /// <returns></returns>
        [HttpGet(Name = "ListaUF-ADO")]
        [Produces("application/json")]
        [ProducesResponseType(StatusCodes.Status200OK)]
        public ActionResult<IEnumerable<UF>> ListaUF()
        {
            List<UF> ret = new List<UF>();
            Cm.CommandText = "SELECT Id, UF, Capital FROM Capitais ORDER BY Id";
            Cn.Open();
            SqlDataReader rd = Cm.ExecuteReader();
            while (rd.Read())
            {
                UF vUF = new UF { Id = 0, Nome = "", Capital = ""};
                vUF.Id = Convert.ToInt32(rd["Id"]);
                vUF.Nome = rd["UF"].ToString();
                vUF.Capital = rd["Capital"].ToString();
                ret.Add(vUF);
            }
            Cn.Close();

            return Ok(ret);
        }

        /// <summary>
        /// Mostra os dados de uma UF específica
        /// </summary>
        /// <remarks>
        /// Caso o id não exista, retorna 404 Not Found. Caso id seja zero retorna Bad Request.
        /// </remarks>
        /// <param name="IdUF">Id da UF que será mostrada</param>
        /// <returns>Um JSON contendo os dados da UF selecionada.</returns>
        [HttpGet("{IdUF:int}", Name = "MostraUF-ADO")]
        [ProducesResponseType(200)]
        [ProducesResponseType(StatusCodes.Status400BadRequest)]
        [ProducesResponseType(StatusCodes.Status404NotFound)]
        public ActionResult<UF> MostraUF(int IdUF)
        {
            if (IdUF < 0)
            {
                return BadRequest();
            }
            UF vUF = new UF { Id = 0, Nome = "", Capital = "" };
            Cm.Parameters.Clear();
            Cm.Parameters.Add("@Id", System.Data.SqlDbType.Int).Value = IdUF;
            Cm.CommandText = "SELECT Id, UF, Capital FROM Capitais WHERE Id = @Id";
            DataTable dt = new DataTable();
            DaG.Fill(dt);
            if(dt.Rows.Count == 0)
            {
                return NotFound();
            }
            DataRow rd = dt.Rows[0];
            vUF.Id = Convert.ToInt32(rd["Id"]);
            vUF.Nome = rd["UF"].ToString();
            vUF.Capital = rd["Capital"].ToString();
            return Ok(vUF);
        }

        /// <summary>
        /// Adiciona uma nova UF à lista
        /// </summary>
        /// <param name="NovaUF"></param>
        /// <returns></returns>
        [HttpPost(Name = "Adiciona-ADO")]
        [ProducesResponseType(StatusCodes.Status200OK)]
        [ProducesResponseType(StatusCodes.Status400BadRequest)]
        [ProducesResponseType(StatusCodes.Status404NotFound)]
        public ActionResult<IEnumerable<UF>> AdicionaUF(UF NovaUF)
        {
            if (NovaUF.Id > 0)
            {
                return AtualizaUF(NovaUF.Id, NovaUF.Nome, NovaUF.Capital);
            }
            Cm.Parameters.Clear();
            Cm.Parameters.Add("@Nome", SqlDbType.Char, 2).Value = NovaUF.Nome;
            Cm.Parameters.Add("@Capital",SqlDbType.VarChar,50).Value = NovaUF.Capital;
            Cm.CommandText = "INSERT INTO Capitais (UF, Capital) VALUES (@Nome, @Capital) ";
            try
            {
                Cn.Open();
                Cm.ExecuteNonQuery();
                Cn.Close();
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
            return ListaUF();
        }

        /// <summary>
        /// Altera todos os dados de uma UF baseado em um id
        /// </summary>
        /// <param name="IdUF">Id da UF que será alterada</param>
        /// <param name="NomeUF">Novo nome (sigla) da UF</param>
        /// <param name="CapitalUF">Novo nome da capital</param>
        /// <returns></returns>
        [HttpPut(Name = "Altera-ADO")]
        [ProducesResponseType(StatusCodes.Status200OK)]
        [ProducesResponseType(StatusCodes.Status400BadRequest)]
        [ProducesResponseType(StatusCodes.Status404NotFound)]
        public ActionResult<IEnumerable<UF>> AtualizaUF(int IdUF, string NomeUF, string CapitalUF)
        {
            Cm.Parameters.Clear();
            Cm.Parameters.Add("@Id", SqlDbType.Int, 2).Value = IdUF;
            Cm.Parameters.Add("@Nome", SqlDbType.Char, 2).Value = NomeUF;
            Cm.Parameters.Add("@Capital", SqlDbType.VarChar, 50).Value = CapitalUF;
            Cm.CommandText = "UPDATE Capitais SET UF = @Nome, Capital = @Capital WHERE Id = @Id ";
            try
            {
                Cn.Open();
                Cm.ExecuteNonQuery();
                Cn.Close();
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
            return ListaUF();
        }

        /// <summary>
        /// Muda apenas a capital de uma UF baseado no nome da UF
        /// </summary>
        /// <param name="NomeUF">Nome da UF (sigla)</param>
        /// <param name="NovaCapital">Nome da nova capital</param>
        /// <returns></returns>
        [HttpPatch(Name = "MudaCapital-ADO")]
        [ProducesResponseType(StatusCodes.Status200OK)]
        [ProducesResponseType(StatusCodes.Status400BadRequest)]
        [ProducesResponseType(StatusCodes.Status404NotFound)]
        public ActionResult<IEnumerable<UF>> MudaCapital(string NomeUF, string NovaCapital)
        {
            Cm.Parameters.Clear();
            Cm.Parameters.Add("@Nome", SqlDbType.Char, 2).Value = NomeUF;
            Cm.Parameters.Add("@Capital", SqlDbType.VarChar, 50).Value = NovaCapital;
            Cm.CommandText = "UPDATE Capitais SET Capital = @Capital WHERE UF = @Nome ";
            try
            {
                Cn.Open();
                Cm.ExecuteNonQuery();
                Cn.Close();
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
            return ListaUF();
        }

        /// <summary>
        /// Elimina uma UF baseado no id
        /// </summary>
        /// <param name="DelId">Id da UF que será eliminada</param>
        /// <returns></returns>
        [HttpDelete(Name = "EliminaUF-ADO")]
        [ProducesResponseType(StatusCodes.Status200OK)]
        [ProducesResponseType(StatusCodes.Status400BadRequest)]
        [ProducesResponseType(StatusCodes.Status404NotFound)]
        public ActionResult<IEnumerable<UF>> EliminaUF(int DelId)
        {
            Cm.Parameters.Clear();
            Cm.Parameters.Add("@Id", SqlDbType.Int, 2).Value = DelId;
            Cm.CommandText = "DELETE FROM Capitais WHERE Id = @Id ";
            try
            {
                Cn.Open();
                Cm.ExecuteNonQuery();
                Cn.Close();
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
            return ListaUF();
        }

    }
}

Deixe seu comentário