Ir al contenido principal

Crear Web API en ASP.NET con ADO.Net usando VS 2019 Método Get- Fase II

Hola nuevamente a todos espero este súper bien... la verdad al escribir este articulo me llena algo de nostalgia, por el simple hecho de tener excelente recuerdos al iniciarme justamente a compartir contenido acerca de ADO.Net, allá por el 2010 y 2011 fueron muchas líneas de código aplicando este componente en el mundo laboral (claro está, la intención es aprender y ir compartiendo lo poco que se pueda por el factor tiempo), y los puedo decir que hay muchas cosas NO ha variado, como por ejemplo del como acceder a la base de datos e del como llamar o innovar a los procedimientos almacenados de la base de datos y ejecutarlas. 

Les podre mencionar que no todos es Entity Framework (database o code first), LINQ, Dapper entre muchas otras tecnologías (ORMs) que hoy en día nos ofrece Microsoft y otras de tipo Open Surce - como siempre recalco, todo depende de tu necesidad y escalabilidad que esperar logran a nivel de la aplicación y base de datos -  al final todos tiene el mismo objetivo que de alguna u otra manera accederán a la base de datos; NO busco entra en debate ni plasmar mucha teoría (la intención es que el articulo sea práctico), lo que SI les dejo claro es que necesitaremos al menos uno de los proveedores de datos de ADO.Net como el SqlCliente.

Recordemos que .NET Core aún admite ADO.NET, excepto para conjuntos de datos y sus tipos relacionados. Si el destino es .NET Core y se necesita una capa de asignación relacional de objetos (ORM), debe usar Entity Framework Core.

En esta Fase II veremos la implementación de método GET, es decir consultaremos a través de procedimiento almacenado que están en nuestra base de datos para recuperar los registros de tabla Usuario.

Lo que veremos en este articulo:

  • Requisitos.
  • Paso 1: Cadena de conexión a base de datos.
  • Paso 2: Implementar el método ListUsers en el proyecto Data.Access.
  • Paso 3: Invocar el método ListUsers en el proyecto WebApi.Data.Business
  • Paso 4: Invocar el método ListUsers en el proyecto WebApi.Domain.
  • Paso 5: Implementar el método GET en el proyecto WebApi.
  • Paso 6: Testear el método GET desde Postman.
  • Conclusión:

Requisitos:

  1. Microsoft Visual Studio Community 2019
  2. .Net Framework 4.6
  3. ADO.Net (tecnología para la conexión a datos)
  4. Microsoft SQL Server 2019 Express
  5. T-SQL (Lenguaje transaccional para SQL)
  6. Postman

Paso 1: Cadena de conexión a base datos:

Comenzamos agregando la cadena de conexión en nuestro archivo .config que se encuentra en el proyecto ArquitecturaWebApi. Es uno de los 5 proyectos que creamos en la Fase I.

Seguidamente abrimos el archivo .config y agregamos el tag connectionStrings y luego asignaremos el nombre a nuestra cadena de conexión, agregamos la instancia del servidor de base de datos, el nombre de la base de datos, usuario y contraseña (en el caso sea autenticación Mixta) y finalmente definamos el proveedor de accesos (recuerda que estamos trabajando con SqlCliente):

<connectionStrings>

    <add name="CnBD" connectionString="Data Source=AQUI_INSTANCIA;Initial Catalog=BD_TEST;User ID=sa;Password=xxxxproviderName="System.Data.SqlClient" />

</connectionStrings>

Paso 2: Implementar el método ListUsers en el proyecto Data.Access:

Iniciamos agregando las referencias System.ConfigurationSystem.Data y System.Data.Cliente; seguidamente importamos las 3 referencia desde la clase UsuarioDAL.cs e implementamos nuestro método con las siguiente consideraciones:

ConnectionStringsSection: Nos proporciona acceso mediante programación a la sección del archivo de configuración de cadenas de conexión.

Se hace uso del SqlCommand y un SqlConnection. Es decir el SqlConnection se abre y se establece como la conexión para el SqlCommand. A continuación, se define el comando a ejecutar y seguidamente se ejecuta con el ExecuteReader().

El método ExecuteReader devuelve un objeto SqlDataReader para ver los resultados de una consulta de tipo selección de datos.

using System;

using System.Collections.Generic;

 

//Importar para acceder al poryecto Models y directio Usuario

using ArquitecturaWebApi.Models.Usuario;

 

using System.Configuration;

using System.Data.SqlClient;

using System.Data;

 

namespace ArquitecturaWebApi.Data.Access.DAL

{

    public class UsuarioDAL

    {

        public static IEnumerable<UsuarioModel> ListUsers()

        {//Acceder al archivo de configuración para ller la cadena de conexión

            string cs = ConfigurationManager.ConnectionStrings["CnBD"].ConnectionString;

 

            List<UsuarioModel> resultUsers = new List<UsuarioModel>();//Instanciamos a nuestro modelo

            using (SqlConnection con = new SqlConnection(cs))//Inicio la conexión a la base de datos

            {

                con.Open();//Abro la conexión a la base de datos

                SqlCommand com = new SqlCommand("SP_SELECCIONAR_USUARIO", con);//Defino el comando a ejeuctar

                com.CommandType = CommandType.StoredProcedure;//Comando de tipo procedimiento almacenado

                SqlDataReader rdr = com.ExecuteReader(); //Ejecuto y cargo lo valor en el data reader

                //Inicio a recorrer los valores del data reader y pasar lo valores al modelo UsuarioModel

                while (rdr.Read())

                {

                    var usuario = new UsuarioModel();

                    usuario.id = Convert.ToInt32(rdr["id"]);

                    usuario.usuario = rdr["usuario"].ToString();

                    usuario.contrasena = rdr["contrasena"].ToString();

                    usuario.intentos = Convert.ToInt32(rdr["intentos"]);

                    usuario.nivelSeg = decimal.Parse(rdr["nivelSeg"].ToString());

                    resultUsers.Add(usuario);

                }

                return resultUsers;//retorno todo los valores

            }

        }

    }

}

Paso 3: Invocar el método ListUsers en el proyecto WebApi.Data.Business:

Ahora invocamos el método ListUsers() de tipo IEnumerable que acabamos de implementar en el proyecto Data.Acces.

sing System;

using System.Collections.Generic;

//Importar los poryectos Models y Data.Access, para acceder al directorio Usuario y DAL

using ArquitecturaWebApi.Models.Usuario;

using ArquitecturaWebApi.Data.Access.DAL;

 

namespace ArquitecturaWebApi.Data.Business

{

    public class Usuario

    {       

        public static IEnumerable<UsuarioModel> ListUsers()

        {

            try

            {

                //Retornamos la lista de valores del método ListUsers() que invocamos

                return UsuarioDAL.ListUsers();

            }

            catch (Exception ex)

            {

                throw new Exception(ex.Message);

            }

        }

    }

}

Paso 4: Invocar el método ListUsers en el proyecto WebApi.Domain:

Seguidamente invocamos el método ListUsers() que acabamos de implementar en el proyecto Data.Business.

using System;

using System.Collections.Generic;

//Importar para acceder al proyecto Models y directorio Usuario, adempas importar el proyecto Data.Business

using ArquitecturaWebApi.Models.Usuario;

using ArquitecturaWebApi.Data.Business;

 

namespace ArquitecturaWebApi.Domain

{

    public class UsuarioDomain

    {

        public IEnumerable<UsuarioModel> ListUsers()

        {

            try

            {//Invocamos al método listar de la capa negocio "Data.Business"

                return Usuario.ListUsers();

            }

            catch (Exception ex)

            {

                throw new Exception(ex.Message);

            }

        }

    }

}

Paso 5: Implementar el método GET  en el proyecto WebApi:

La implementación de este método GET se logrará en base a la invocación al método ListUsers. Para cual iniciaremos agregando las referencias a los proyectos de ArquitecturaWebApi.Models y ArquitecturaWebApi.Domain, seguidamente desde el code behind debemos importarlas.
Recuerden que la sobrecarga de métodos nos permite definir dos o más métodos con el mismo nombre, pero que difieren en cantidad o tipo de parámetros.
Además, los métodos a implementar serán 2 con el mismo nombre de GET (aplicaremos sobrecarga de métodos); el primero de ellos nos permitirá listar todos los registros ingresados y el segundo nos permitirá filtras los registros de acuerdo al ID (se aplicará LINQ).

//Importar los proyectos

using ArquitecturaWebApi.Models.Usuario;

using ArquitecturaWebApi.Domain;

 

namespace ArquitecturaWebApi.Controllers

{

    public class UsuarioController : ApiController

    {

        UsuarioDomain usuarioDomain = new UsuarioDomain();

 

        /// <summary>

        /// GET: api/Usuario (retorna toda la lista)

        /// </summary>

        /// <returns></returns>

        [ResponseType(typeof(IEnumerable<UsuarioModel>))]

        public IEnumerable<UsuarioModel> Get()

        {

            return usuarioDomain.ListUsers().ToArray();

            //return users;

        }

 

        /// <summary>

        /// GET: api/Usuario/5 (retorna los valores de un sólo registro según el valor id)

        /// </summary>

        /// <param name="id"></param>

        /// <returns></returns>

        //public IHttpActionResult Get(int id)

        public HttpResponseMessage Get(int id)

        {

            HttpResponseMessage httpMsg = null;

            var usuario = usuarioDomain.ListUsers().ToArray().FirstOrDefault((p) => p.id == id);

            if (usuario == null)

            {

                //return NotFound();

                httpMsg = Request.CreateErrorResponse(HttpStatusCode.NotFound, "El Id (" + id.ToString() + ") no se encuentra registrado");

            }

            else {

                httpMsg = Request.CreateResponse(HttpStatusCode.OK, usuario);

            }

            //return Ok(usuario);

            return httpMsg;

        }

    }

Paso 6: Testear el método GET desde Postman:

Ejecutamos la WebApi desde el Visual Studio, abrimos el SQL Server Management Studio para compara los resultado y cargamos Postman e ingresamos las siguientes URLs:

https://localhost:44336/api/Usuario

https://localhost:44336/api/Usuario/1

Resultados de todos los registros ingresados en la tabla Usuario


Registros del usuario ID = 1

Conclusión:

Principalmente quería inicia hablando acerca de ADO.Net sabiendo que aun se utiliza los objetos ADO, como Connection y Command, y lo ya muy recurrentes objetos clave como son DataSet, DataReader y DataAdapter; y como verán no hay ninguna complejidad en el momento de implementar con el tipo de proyectos de Web.Api, al final son tecnologías con distinto aspectos que conviven de maravilla, sabiendo que la web api es una intefaz que ofrecer diferentes rutinas de cara al usuario final y ADO.Net se concentra en la conexión a la base de datos todo dependerá de acuerdo a necesidad de tu requerimiento.

Puedes descargar la solución completa que incluyendo todos los métodos ya implementados y testeados desde Postman.

Espero sus comentarios, bendiciones para todos y gratitud a Dios 😊 por todo; nuevamente gracias a todos ustedes por la acogida de este nuevo articulo, un fuerte abrazo para todos ✌...!!!

Comentarios

Entradas más populares de este blog

Habilitar Usuario HR Oracle

Al realizar la primera instalación del Oracle, el usuario HR por defecto está bloqueado y por ende no podemos loguearnos como dicho usuario, lo que debe hacer son los siguiente pasos, aplicables para Linux o Windows.
1. Conectarse como usuario system o sysdba + contraseña haciendo uso del comando connect.
Usuario: system
Password: xxxx 


2. Hacer uso  del comando alter user hr account unlock desbloqueamos la cuenta.
alter user hr account unlock;

3. Escribimos el comando alter user HR identified by hr; con esto estamos diciendo que la contraseña será hr.

alter user HR identified by hr;

4. Ahora testeamos la conexión con el comando - conn hr/hr@xe. Si deseas después de conectarnos se puede realizar un select a la tabla employees del hr.


Resultado del select realizado
5. Con todos estos pasos realizados ya podemos logearnos desde cualquier IDE como el usuario hr  y la contraseña hr que definimos en el paso 3. 
Para finalizar nos loguearemos con el IDE Oracle SQL Developer.

Espero les sea de utilidad,…

Usuario SYS y SYSTEM - ORACLE

Usuario SYS y SYSTEM
Ambos usuario son creados de forma automática al crear la base de datos ORACLE y se otorga el rol de DBA.

SYS (password por defecto: CHANGE_ON_INSTALL).
SYSTEM (password por defecto: MANAGER).

Lo que se recomienda es cambiar el password de ambos usuarios por el tema de seguridad.

SYS:
Todas las tablas y vistas para el diccionario de datos de la base de datos están almacenados en el esquema SYS. Estas tablas y vistas son críticas para el funcionamiento de la base de datos ORACLE. Para mantener la integridad del diccionario de datos, las tablas del esquema SYS son manipulados solo por la base de datos. Nunca se debería modificar algo o crear tablas en el esquema del usuario SYS.

SYSTEM:
El usuario SYSTEM se utiliza para crear tablas y vistas adicionales que muestran información administrativa, tablas internas y vistas utilizado por varias opciones y herramientas de la base de datos ORACLE. No se recomienda utilizar el esquema SYSTEM para almacenar tablas de interés para usu…

Parámetro de entrada y salida – PL/SQL

Parámetro de entrada y salida – PL/SQL:
Los parámetros de entrada y salida no son los parámetros de inicialización de la base de datos ORACLE. Los parámetros de entra y salida son utilizados mayormente en implementaciones de funciones, procedimientos almacenados o bloques de código bajo el lenguaje del PL/SQL, se considera que ambos parámetros (entra y salida) puedan realizar operaciones en el mismo bloque PL/SQL, es decir, si enviamos un parámetro de entrada hará que cumpla cierta operación y retornara los valores de salida de dicha operación procesada de acuerdo al parámetro de ingresado. Es de acuerdo al caso que nos presenta en la implementación.
Algo importante al definir los parámetros, es saber y considerar cuántos tipos de parámetro existe si solo hablamos de entrada y salida, en realidad mi determinación seria 3 tipos:

Parámetros:

IN – entrada
OUT – salida
IN OUT – entrada salida

Parámetro IN – entrada:
El comportamiento común de estés tipos de parámetros es estar siempre pendiente d…