Este tutorial está pensado para todos aquellos que deben de salir de la "zona de confort" programando en .NET, al tener que conectar con una base de datos no soportada de forma nativa por Entity framework.
Así revisaré paso a paso cómo conectarme vía ADO.NET y utilizar las funciones más básicas para poder hacer un CRUD (Create, Read, Update y Delete) de una sola tabla sencilla desde una base de datos PostgreSQL.
En este tercer capítulo del tutorial voy a escribir y describir el método de selección, sin olvidar el utilizar test unitarios para probar el código y el funcionamiento.
Selección por Id
Casi siempre el primer método que realizamos al construir un CRUD es el de selección por el ID.
Recuerda que para seguir este tutorial paso a paso, debieras tener una base de datos PostgreSQL con una pequeña tabla de usuarios, y una pequeña clase de conexión (y su test que prueba que funciona); que todo ha sido descrito en los capítulos anteriores.
Así ahora vamos definir la clase en la capa de DAL o Modelo en la que vamos a añadir el método de select, y vamos ir construyendo:
public class Usuarios { public Usuario GetUserById(Usuario pUsuario) { var resultado = new Usuario(); var conexion = new ConnectionPostgreSQL(); var cadenaSQL = string.Empty; using (var db = conexion.AbreConexion()) { cadenaSQL = "SELECT * FROM Usuario WHERE Id = " + pUsuario.Id; try { if (error.IdError == 0) { var comando = new NpgsqlCommand(cadenaSQL, db); var lector = comando.ExecuteReader(); while (lector.Read()) { resultado.id = (int)lector["Id"]; resultado.email = (string)lector["nombre"]; } } } catch (Exception exception) { throw; } } return resultado; }
La primera pregunta que emerge del análisis del código es porqué utilizo una clase entera para pasar la primitiva Int del Id a recuperar. Y la repuesta es: porque me gusta.
Prefiero utilizar clases porque la experiencia me ha demostrado que las confusiones y los cambios en los nombres y tipos de parámetros, producen muchos dolores de cabeza que el utilizar clases fuertemente tipadas elimina.
En la siguiente línea, cargo en la variable de resultado el tipo de clase usuario. Esto es por mi forma de desarrollar, que intento por todos los medios evitar las excepciones, por lo cual evito devolver un null siempre que puedo.
Por último, en estas declaraciones, instancio la clase de conexión y la variable que va a contener la cadena SQL.
Utilizando la construcción using de C#, nos evitamos el tener que andar cerrando la conexión cuando la abrimos en esta línea. Sea por la devolución normal o por la devolución por una excepción, se nos cerrará la conexión.
Y entramos en la chicha insertando la cadena SQL de select, al igual que hacemos en ADO.NET. Teniendo en cuenta dos cosas, que al ser el Id numérico, no es necesario ponerle las comillas simples; y que esta manera de hacer las cosas permitiría inyección de SQL - un serio problema de seguridad. Asique no lo uses en producción a menos que lo tengas muy, muy claro que no tendrá acceso externo.
Todo el código que sigue está protegido por medio de un Try Catch, que envía la excepción hacía el exterior por medio de un throw. Y, en otro punto de la aplicación, se tratará y se realizará con esa información lo que sea más adecuado.
Ahora vamos a cargar la orden SQL en la conexión adecuada (y abierta), y mandamos a ejecutar en la base de datos y que me recupere un objeto Reader.
Ok, ya tengo los datos en mi poder, pero ahora los tengo que mapear a la entidad Usuario, para poder utilizarla en el resto de la aplicación. Para ello lanzo un bucle While para leer todos los registros recuperados (que debería ser uno) y lo mapeo a las propiedades de la entidad.
Por fin, si todo vá bien, devolvemos un usuario traído desde la base de datos.
El test no es opcional
La mejor manera de testear esto... es no hacerlo contra la base de datos real. Pero la mayoría de las veces, hasta que no tengas un nivel de madurez como para utilizar Mocks, es el camino rápido.
La principal pregunta es ¿qué pruebo? En este caso voy a probar lo más inmutable de un registro en una base de datos, su identificador. Por lo cual mi test es algo así:
[TestMethod()] public void GetUserByIdTest() { var accion = new Usuarios(); int id = 1; var resultado = accion.GetUserById (new Usuario { id=id }); Assert.AreEqual(id, resultado.id); }
Y si te da verde al ejecutarlo, es que todo ha ido bien.
Continuara...
En GenbetaDev | Conectar nuestra aplicación .NET a PostgreSQL. Más información | PostgreSQL, Visual Studio Express 2013, Putty, PgAdmin