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 profesionalizar nuestro código separando la lógica de acceso a datos en una clase propia y añadiendo la capacidad de consultar información.
Ejercicio 2: Clase Vivero, Consultas y Transacciones
Planta { Id = 1, NombreComun = Margarita, NombreCientifico = Argyranthemum, Precio = 3,5, Stock = 999 }
Planta { Id = 3, NombreComun = Lavanda, NombreCientifico = Lavandula, Precio = 6,75, Stock = 30 }
Planta { Id = 4, NombreComun = Cactus, NombreCientifico = Cactaceae, Precio = 8, Stock = 25 }
Planta { Id = 5, NombreComun = Bonsai, NombreCientifico = Ficus retusa, Precio = 45, Stock = 5 }
Operaciones completadas.
Requisitos
Planta con las propiedades que se corresponden con la tabla (Id, NombreComun, NombreCientifico, Precio, Stock).Vivero: Esta clase encapsulará la lógica de base de datos y la información del comercio.
Nombre (string), Direccion (string) y una lista de plantas (List<Planta> Plantas).CreaTabla().InsertaPlanta(Planta p).ObtenPlantas() que realice un SELECT * FROM planta, lea los datos con SqliteDataReader, convierta cada fila en un objeto Planta y devuelva una List<Planta>.ModificaStock(int id, int nuevoStock) que actualice el campo stock (UPDATE).EliminaPlanta(int id) que borre el registro correspondiente (DELETE).List<Planta> en memoria y rellénala con 5 plantas nuevas.Vivero para insertarlas en la base de datos (¡Usa transacciones!).ModificaStock para cambiar el stock de una de las plantas.EliminaPlanta para borrar otra.ObtenPlantas() y muestra el listado completo para verificar los cambios.Transacciones (Bonus Recomendado)
Cuando realizamos múltiples operaciones de escritura seguidas (como insertar una lista de plantas), es una muy buena práctica utilizar Transacciones.
conexion.BeginTransaction()) y haz el Commit() al acabar.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).ObteneInventario() 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.ObteneInventario 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.