Buscar este blog

sábado, 30 de diciembre de 2017

DataSet + C#

En la actualidad se ejemplifica en artículos y videos el uso de ORM (mapeo objeto-relacional) específicamente de ADO.NET Entity Framework. Pero mis intenciones no es solo escribir sobre Entity Framework sino de publicar varias formas de comunicación de una Aplicación con un gestor de base de datos. Por ende voy a comenzar esta serie de artículos con nuestro viejo pero no olvidado DataSet.

La utilización del DataSet proviene de Microsoft .NET Framework (1.X) según Brice-Arnaud GUÉRIN en el libro ASP.NET 4.5 en C# con Visual Studio 2012 el DataSet es una caché de datos (Microsoft la llama, también, grupo) estructurados bajo la forma de DataTable y de DataRelation”.

El DataSet es un objeto que guarda en memoria caché las tablas y relaciones de una fuente de base de datos. Donde se puede utilizar el lenguaje de consulta y ejecutar los CRUD que son funciones básicas de bases de datos en un software.

Se utiliza para este ejemplo el lenguaje de consulta SQL, el lenguaje de programación C# y el IDE Microsoft Visual Studio Community.

Situación o Negocio


Para no complicar el ejemplo se utiliza dos tablas con pocos campos.

En una universidad los estudiantes estudian una carrera de ingeniería. De los estudiantes se saben su DNI y Nombre. De la carrera de ingeniería el nombre.

La relación de estas tablas es de 1:N (Uno a varios). Un estudiante solo estudia una carrera de ingeniería y una carrera de ingeniería posee varios estudiantes.

Script – Sql


CREATE TABLE engineering
(
 [Id] BIGINT IDENTITY (1, 1) NOT NULL, 
    [Name] VARCHAR(255) NOT NULL,
 PRIMARY KEY CLUSTERED ([Id] ASC),
    UNIQUE NONCLUSTERED ([Name] ASC)
)

CREATE TABLE student
(
 [Id] BIGINT IDENTITY (1, 1) NOT NULL, 
 [DNI] VARCHAR(255) NOT NULL,    
 [Name] VARCHAR(255) NOT NULL,
 [IdEngineering] BIGINT NOT NULL, 
 PRIMARY KEY CLUSTERED ([Id] ASC),
 UNIQUE NONCLUSTERED ([DNI] ASC),
 CONSTRAINT [FK] FOREIGN KEY ([IdEngineering]) 
  REFERENCES [dbo].[engineering] ([Id]) 
  ON DELETE CASCADE 
  ON UPDATE CASCADE 
)


Paso 1
  • Abrir Visual Studio
  • Crear un proyecto de tipo Class Library. (FILE ->  new -> Proyect)
  •  Ctrl + Shift + A 
  • Crear el fichero de Sql (mdf) 

Paso 2

  • Ctrl + Shift + A
  • Crear el DataSet
  • Dar doble click en el fichero mdf y se muestra
  • Click derecho en el fichero mdf y seleccionar New Queryv

  • Copiar los dos Script – Sql descrito con anterioridad y crea las dos tablas
  • Mover las dos tablas al DataSet

Paso 3 

Por defecto el DataSet crea por cada tabla un DataTable que contiene los campos de la tabla original de la base de datos y un TableAdapter encargada de sincronizar un DataTable con la tabla de la base de datos.

Los TableAdapter contiene por defecto:
  •  La conexión con la base de datos (Esta cadena de conexión se guarda en el fichero app.config)
  •  Los comandos: Select, Insert, Update y Delete con sus sintaxis predeterminada del lenguaje de consulta Sql 

En el caso de la tabla engineering el comando eliminar (DeleteCommand) posee el código siguiente por defecto.


Se Puede cambiar el código de estos comando según su interés, es este caso lo cambiamos a


DELETE FROM engineering
WHERE (Id = @Original_Id)

El parámetro @Original_Id se guarda en una lista de parámetros que posee este comando. Con el objetivo de recibir un parámetro con un valor de entrada cuando se ejecute.


Si observan en el TableAdapter existe un método llamado Fill que contiene un método llamado GetData. Este método responde al comando seleccionar (SelectCommand). Este método devuelve un DataTable con los registros de datos de la tabla de la base de datos y se ejecuta de modo lectura.


 Paso 4

Si se desea crear más consultas que no sean estos comandos por defectos pueden dar un click derecho en el TableAdapter y seleccionar Add Query y muestra la siguiente ventana.


Donde puede escoger tres opciones:

  • Crear una sintaxis Sql 
  • Crear un procedimiento almacenado (stored procedure) 
  • Usar un procedimiento almacenado existente. 

Nota: Los procedimiento almacenado contienen código Sql que se ejecutan directamente en el motor de bases de datos.

En este caso vamos a seleccionar una sintaxis Sql y muestra la ventana siguiente


Se necesita crear una consulta que diga cuantas carreras de ingeniería tiene la universidad.



Paso 5

Se desea saber la cantidad de alumnos por carrera de ingeniería. En este caso como necesitamos tener dos campos que tenga el nombre de la carrera de ingeniería y otro campo que diga la cantidad de alumnos; es necesario crear un nuevo TableAdapter que genere este DataTable:

 Se da un click derecho al DataSet y se crea un TableAdapter



Este TableAdapter tiene una particularidad: Es de solo lectura, puede realizar consultar con Select pero no puede ni eliminar, insertar o actualizar un registro.

Paso 6

Se tiene el diseño, las consultas y las funciones básicas de los CRUD de las tablas para gestionar la información de la base de datos. Ahora pasaremos a testear estas acciones con las pruebas unitarias.
  •  Ctrl + Shift + A 


        [TestMethod]
        public void TestInsertEngineering()
        {
            var adapter = new engineeringTableAdapter();
            for (int i = 0; i < 10; i++)
            {
                adapter.Insert("Engineering " + i);
            }

            var datatable1 = new DataSet1.engineeringDataTable();
            adapter.Fill(datatable1);

            foreach (var row in datatable1)
                Console.WriteLine(row.Name);

            Assert.AreEqual(10, datatable1.Count);
        }


 var adapterCount = new engineeringCountStudentTableAdapter();
 var datatable3 = new DataSet1.engineeringCountStudentDataTable();
 adapterCount.Fill(datatable3);

 foreach (var item in datatable3)
 {
  Console.WriteLine(string.Format("Carrera = {0}, Cantidad = {1}",item.Name, item.CountStudent));
 }


Conclusiones

Se realiza paso por paso un pequeño ejemplo de cómo utilizar nuestro viejo DataSet y se realiza pruebas unitarias.

Espero que les haya gustado y recuerden que mi objetivo es publicar varias formas de comunicación de una Aplicación con un gestor de base de datos.

ADO.NET + DataSet + C#


Se despide
 YAM