Antes de empezar
Para realizar estos ejercicios, deberás descargar los recursos del enlace de proyecto_poo. Como puedes ver, la solución está compuesta de varios proyectos. Cada uno de ellos corresponde con un ejercicio, deberás implementar todo el código, tanto de la Main como de los métodos que se piden en cada ejercicio. Cada proyecto contiene el test correspondiente, que deberás pasar para comprobar que has hecho el ejercicio correctamente.
Vamos a crear una pequeña gestión de base de datos para un vivero. En este primer ejercicio nos centraremos en crear la estructura de la base de datos y poblarla con datos iniciales utilizando ADO.NET y SQLite.
Ejercicio 1: Gestión de Plantas Insertando datos de ejemplo... Insertando -> Rosa, Rosa spp., 10.50, 50 Insertando -> Lirio, Lilium, 7.80, 80 Insertando -> Tulipán, Tulipa, 5.25, 100 Insertando -> Orquídea, Orchidaceae, 25.00, 20 Datos insertados correctamente.
Requisitos
Microsoft.Data.Sqlite.vivero.db en el Main.CreaTabla(SqliteConnection conexion) que reciba la conexión abierta y cree la tabla planta (si no existe) con las columnas:
id: Entero, Clave Primaria y Autoincremental.nombre_comun: Texto, no nulo.nombre_cientifico: Texto, puede ser nulo o vacío.precio: Real.stock: Entero.InsertaPlanta(...)) que reciba la conexión y los datos necesarios.@parametro) para evitar la inyección SQL.Pistas
using SqliteConnection ... para gestionar la conexión correctamente.CREATE TABLE IF NOT EXISTS... y INSERT INTO....comando.ExecuteNonQuery() para las operaciones que no devuelven datos."Explora tu Base de Datos"
Una vez ejecutado el programa, se creará el archivo vivero.db. ¡No lo abras con un editor de texto!
Te recomendamos utilizar una extensión de VS Code como SQLite Viewer (tal y como se indica en los apuntes) para abrir el archivo .db y comprobar visualmente que la tabla y los registros se han creado correctamente.
Vamos a crear una aplicación para gestionar una rutina de ejercicios de gimnasio. En este ejercicio, nos centraremos en aplicar el patrón DAO para separar la lógica de acceso a datos de la lógica de negocio, usando enumeraciones y DTOs.
Ejercicio 2: Gestión de Rutinas de Gimnasio Creando e insertando ejercicios... Ejercicios que trabajan el músculo 'Pecho': - Press de Banca - Flexiones Actualizando 'Flexiones' a 'Flexiones Diamante'... Eliminando 'Press de Banca'... Listado final de ejercicios: - Flexiones Diamante (Músculos: Pecho, Triceps) - Sentadillas (Músculos: Cuadriceps, Gluteos) - Dominadas (Músculos: Espalda, Biceps) Operaciones completadas.
Requisitos
Musculo con al menos 5 valores (ej. Pecho, Espalda, Biceps, Triceps, Cuadriceps, Gluteos).Ejercicio con las propiedades: Id (int), Nombre (string) y GruposMusculares (una List<Musculo>).CreaTabla(SqliteConnection conexion) que cree la tabla ejercicios si no existe. La columna grupos_musculares deberá ser de tipo TEXT para almacenar la lista de músculos (p. ej., como una cadena separada por puntos y comas).EjercicioDAO):
EjercicioDAO que implemente IDisposable.SqliteConnection.Crea(Ejercicio ejercicio): Inserta un nuevo registro. Deberás convertir la List<Musculo> a una cadena para guardarla.Lee(): Devuelve un IEnumerable<Ejercicio>. Deberás convertir la cadena de la base de datos de nuevo a una List<Musculo>.Actualiza(Ejercicio ejercicio): Modifica un ejercicio existente.Elimina(int id): Borra un ejercicio por su Id.EjerciciosPorMusculo con las propiedades Musculo (de tipo Musculo) y NombresEjercicios (una List<string>).ObtenEjerciciosPorMusculo(Musculo musculo) que devuelva un objeto EjerciciosPorMusculo. Este método buscará en la base de datos todos los ejercicios que contengan el músculo especificado en su lista de grupos musculares.Main):
gimnasio.db y llama al método para crear las tablas.EjercicioDAO dentro de un bloque using.ObtenEjerciciosPorMusculo para obtener y mostrar todos los ejercicios que trabajan un músculo concreto (p. ej., Musculo.Pecho).Actualiza para modificar uno de los ejercicios.Elimina para borrar otro.Lee() para obtener y mostrar la lista completa de ejercicios restantes, incluyendo sus grupos musculares.Pistas:
string.Join(",", ejercicio.GruposMusculares).cadena.Split(',').Select(e => Enum.Parse<Musculo>(e)).ToList().WHERE con el operador LIKE de SQL (ej. WHERE grupos_musculares LIKE '%Pecho%').Vamos a refactorizar el ejercicio anterior para seguir estrictamente el patrón DAO (Data Access Object) tal como se explica en los apuntes de la unidad. Esto nos permitirá separar completamente la lógica de acceso a datos de la lógica de negocio. Recuerda crear cada entidad en ficheros distintos, así como los DAO.
Ejercicio 3: Patrón DAO (Data Access Object) Vivero: Vivero El Jardín Dirección: Calle de las Flores 123 Inventario Valorado: Petunia: 150 unidades - Valor Total: 375,00 € Geranio: 80 unidades - Valor Total: 240,00 € Operaciones completadas.
Requisitos
Planta: Propiedades (Id, NombreComun, NombreCientifico, Precio, Stock).Vivero: Propiedades (Nombre, Direccion) y una lista de plantas (List<Planta>).PlantaDAO que implemente IDisposable para gestionar la conexión automáticamente.
Dispose() para cerrar la conexión.PlantaDAO:
Create(Planta p): Inserta una nueva planta.Read(): Devuelve IEnumerable<Planta> con todas las plantas (usa yield return).Read(int id): Devuelve Planta? buscando por ID.Update(Planta p): Actualiza una planta existente. Comprueba antes si existe con Read(id).Delete(int id): Borra una planta por ID. Comprueba antes si existe.Count(): Devuelve el número total de plantas (usa ExecuteScalar).PlantaStock con las propiedades: Nombre_Comun, Stock y ValorTotal (este último será el cálculo de precio * stock).ObtenerInventario() que devuelva IEnumerable<PlantaStock>.SELECT ..., precio * stock as valor ...).vivero.json y deserialízalo en un objeto de la clase Vivero (que contendrá el nombre, dirección y las plantas iniciales).using PlantaDAO dao = new(...).dao.Count() == 0), recorre las plantas del objeto Vivero y guárdalas una a una usando dao.Create().Update/Delete) utilizando el DAO.ObtenerInventario del DAO).Mantén el método de crear la tabla fuera del DAO o como un método utilitario separado, ya que el DDL no suele formar parte del DAO estándar.