ASP .NET MVC - CRUD Básico com ADO.NET e JQuery - I


Hoje vamos recordar como fazer um CRUD básico em uma aplicação ASP .NET MVC sem usar o Entity Framework.

Neste artigo vou mostrar como acessar um banco de dados relacional usando ADO .NET em uma aplicação ASP .NET MVC.

É um artigo para iniciantes onde não vou usar o Entity Framework e onde vamos implementar as operações CRUD usando ADO .NET e Jquery. 

Essa abordagem funciona bem com aplicações pequenas e com modelo de dados bem simples por isso vamos definir um modelo de dados com apenas uma tabela Clientes e fazer o CRUD.

Podemos usar qualquer banco de dados relacional, bastando para isso usar o respectivo provedor. Neste exemplo para ficar bem simples vou usar o SQL Server 2012.

Criei um banco de dados chamado ContatosDB e uma tabela Clientes com a seguinte estrutura:

USE [ContatosDB]

CREATE TABLE [dbo].[Clientes](
  [ClienteId] [int] IDENTITY(1,1) NOT NULL,
  [Nome] [nvarchar](150) NOT NULL,
  [Endereco] [nvarchar](150) NULL, 
  [Email] [nvarchar](150) NULL)
GO

A título de exemplo inclui alguns dados iniciais na tabela:

A string de conexão do banco de dados de definida abaixo:
"Data Source=MACORATTI;Initial Catalog=ContatosDB;Integrated Security=True;"

Note que para o seu ambiente este valor deverá ser diferente.

Criando o projeto no VS 2017

Vamos criar um novo projeto do tipo ASP .NET Core Web Application (.NET Framework) usando o template MVC, sem autenticação, chamado MvcClientes:

Será criado um projeto contendo Views, Controllers e Models que iremos usar.

Definindo o modelo e a string de conexão

Na pasta Models do projeto vamos criar a classe Cliente com o código abaixo:

    public class Cliente
    {
        public int ClienteId { get; set; }
        public string Nome { get; set; }
        public string Endereco { get; set; }
        public string Email { get; set; }
    }

Agora abra o arquivo web.config e defina a string de conexão :

   ....
   <connectionStrings>
<add name="SqlConexao" connectionString="Data Source=MACORATTI;
  Initial Catalog=ContatosDB;Integrated Security=True;" providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>

Dessa forma ao executar pela primeira vez nossa aplicação iremos obter string de conexão SqlConexao deste arquivo.

Ajustando o controlador HomeController

Na pasta Controllers vamos ajustar o código do controlador HomeController que foi criado por padrão. Vamos substituir o código existe e vamo definir as seguintes funcionalidades:

1 - Método Action para manipular a operação GET
Dentro deste método Action, todos os registros da tabela Clientes são retornados para a coleção View como uma lista genérica.

2- Método Action para inserir um Cliente
Dentro desse método Action, o objeto Cliente recebido é inserido na tabela Clientes e o objeto Cliente  atualizado com ClienteId gerado é retornado para a View.

3- Método Actiion para atualizar um cliente
Dentro deste método Action, o objeto Cliente é recebido como parâmetro. Os valores de nome, endereço e email são atualizados na tabela Clientes usando o valor ClienteId.

4- Método Action para excluir um cliente
Dentro deste método Action, o valor ClienteId é recebido como parâmetro. O registro do cliente é excluído da tabela Clientes usando o valor ClienteId.

Neste controlador vamos usar os namespaces :

using System.Configuration;
using System.Data.SqlClient;

Para poder acessar os objetos ADO .NET e para poder definir o arquivo de configuração do projeto onde vamos especificar a string de conexão com o banco de dados.

O objetos ADO .NET usados são:

Para operação definimos consultas SQL parametrizadas:

Abaixo vemos o código do controlador HomeController:

using MvcClientes.Models;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.SqlClient;
using System.Web.Mvc;
namespace MvcClientes.Controllers
{
    public class HomeController : Controller
    {
        // GET: Clientes
        public ActionResult Index()
        {
            List<Cliente> clientes = new List<Cliente>();
            string constr = ConfigurationManager.ConnectionStrings["SqlConexao"].ConnectionString;
            string query = "SELECT * FROM Clientes";
            using (SqlConnection con = new SqlConnection(constr))
            {
                using (SqlCommand cmd = new SqlCommand(query))
                {
                    cmd.Connection = con;
                    con.Open();
                    using (SqlDataReader sdr = cmd.ExecuteReader())
                    {
                        while (sdr.Read())
                        {
                            clientes.Add(new Cliente
                            {
                                ClienteId  = Convert.ToInt32(sdr["ClienteId"]),
                                Nome = Convert.ToString(sdr["Nome"]),
                                Endereco = Convert.ToString(sdr["Endereco"]),
                                Email = Convert.ToString(sdr["Email"])
                            });
                        }
                    }
                    con.Close();
                }
            }
            if (clientes.Count == 0)
            {
                clientes.Add(new Cliente());
            }
            return View(clientes);
        }
        //
        [HttpPost]
        public JsonResult InsertCliente(Cliente cliente)
        {
            string query = "INSERT INTO Clientes VALUES(@Nome, @Endereco, @Email)";
            query += "SELECT SCOPE_IDENTITY()";
            string constr = ConfigurationManager.ConnectionStrings["SqlConexao"].ConnectionString;
            using (SqlConnection con = new SqlConnection(constr))
            {
                using (SqlCommand cmd = new SqlCommand(query))
                {
                    cmd.Parameters.AddWithValue("@Nome", cliente.Nome);
                    cmd.Parameters.AddWithValue("@Endereco", cliente.Endereco);
                    cmd.Parameters.AddWithValue("@Email", cliente.Email);
                    cmd.Connection = con;
                    con.Open();
                    cliente.ClienteId = Convert.ToInt32(cmd.ExecuteScalar());
                    con.Close();
                }
            }
            return Json(cliente);
        }
        //
        [HttpPost]
        public ActionResult UpdateCliente(Cliente cliente)
        {
            string query = "UPDATE Clientes SET Nome=@Nome, Endereco=@Endereco, Email=@Email 
WHERE ClienteId=@ClienteId";
            string constr = ConfigurationManager.ConnectionStrings["SqlConexao"].ConnectionString;
            using (SqlConnection con = new SqlConnection(constr))
            {
                using (SqlCommand cmd = new SqlCommand(query))
                {
                    cmd.Parameters.AddWithValue("@ClienteId", cliente.ClienteId);
                    cmd.Parameters.AddWithValue("@Nome", cliente.Nome);
                    cmd.Parameters.AddWithValue("@Endereco", cliente.Endereco);
                    cmd.Parameters.AddWithValue("@Email", cliente.Email);
                    cmd.Connection = con;
                    con.Open();
                    cmd.ExecuteNonQuery();
                    con.Close();
                }
            }
            return new EmptyResult();
        }
        //
        [HttpPost]
        public ActionResult DeleteCliente(int clienteid)
        {
            string query = "DELETE FROM Clientes WHERE ClienteId=@ClienteId";
            string constr = ConfigurationManager.ConnectionStrings["SqlConexao"].ConnectionString;
            using (SqlConnection con = new SqlConnection(constr))
            {
                using (SqlCommand cmd = new SqlCommand(query))
                {
                    cmd.Parameters.AddWithValue("@ClienteId", clienteid);
                    cmd.Connection = con;
                    con.Open();
                    cmd.ExecuteNonQuery();
                    con.Close();
                }
            }
            return new EmptyResult();
        }
    }
}

Na segunda parte do artigo iremos criar a View do projeto. Aguarde.

"E disse Jesus: As raposas têm covis, e as aves do céu têm ninhos, mas o Filho do homem não tem onde reclinar a cabeça."
Mateus 8:20

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti