lunes, 16 de junio de 2014

El Demo del Día: Convertir DataTable en Lista de Objetos y Viceversa

Convertir DataTable en Lista de Objetos y Viceversa

Cuando trabajamos en forma distribuida, usamos Librerías, Clases y Métodos, algunos trabajamos con Listas de Objetos y otros con DataTables y DataSets. En ambos casos, muchas veces necesitamos la funcionalidad de la otra estructura de datos, por ejemplo si usamos Listas de Objetos y queremos migrar o insertar gran cantidad de datos hacia SQL Server mejor sería usar SqlBulkCopy, pero el metodo WriteToServer necesita como parámetro un DataTable, es por eso que presento un par de métodos que permiten realizar el cambio de uno a otro para cuando se necesite.

Paso 1: Crear una Clase Genérica para crear los Métodos que usen la Lista de Objetos
using System.Reflection;
using System.Data;

namespace Conversion_DataTable_Lista
{
    public class ucTablaLista<T>
    {
    }
}

Paso 2: Función Genérica para Convertir un DataTable en Lista de Objetos
        public static List<T> TablaALista(DataTable tabla)
        {
            List<T> lista = new List<T>();
            Type tipo = typeof(T);
            object obe = null;
            string tipoDato;
            string campo;
            for (int i = 0; i < tabla.Rows.Count; i++)
            {
                obe = Activator.CreateInstance(tipo);
                for(int j=0;j<tabla.Columns.Count;j++)
                {
                    campo = tabla.Columns[j].ColumnName;
                    tipoDato = tabla.Columns[j].DataType.ToString().ToLower();
                    if (tipoDato.Contains("int16")) obe.GetType().GetProperty(campo).
                      SetValue(obe, (short)tabla.Rows[i][j]);
                    else
                    {
                        if (tipoDato.Contains("int32")) obe.GetType().GetProperty(campo).
                          SetValue(obe, (int)tabla.Rows[i][j]);
                        else
                        {
                            if (tipoDato.Contains("decimal")) obe.GetType().GetProperty(campo).
                              SetValue(obe, (decimal)tabla.Rows[i][j]);
                            else obe.GetType().GetProperty(campo).SetValue(obe,
                              tabla.Rows[i][j].ToString());
                        }
                    }                  
                }
                lista.Add((T)obe);
            }
            return (lista);
        }

Paso 3: Función Genérica para Convertir una Lista de Objetos en DataTable
        public static DataTable ListaATabla(List<T> lista)
        {
            DataTable tabla = new DataTable();
            //Crear la Estructura de la Tabla a partir de la Lista de Objetos
            PropertyInfo[] propiedades =  lista[0].GetType().GetProperties();
            for (int i = 0; i < propiedades.Length; i++)
            {
                tabla.Columns.Add(propiedades[i].Name, propiedades[i].PropertyType);
            }
            //Llenar la Tabla desde la Lista de Objetos
            DataRow fila = null;
            for (int i = 0; i < lista.Count; i++)
            {
                propiedades = lista[i].GetType().GetProperties();
                fila = tabla.NewRow();
                for (int j = 0; j < propiedades.Length; j++)
                {
                    fila[j] = propiedades[j].GetValue(lista[i], null);
                }
                tabla.Rows.Add(fila);
            }
            return (tabla);
        }

Paso 4: Crear una Clase Entidad para Almacenar los Productos
    public class beProducto
    {
        public int ProductID { get; set; }
        public string ProductName { get; set; }
        public int SupplierID { get; set; }
        public int CategoryID { get; set; }
        public decimal UnitPrice { get; set; }
        public short UnitsInStock { get; set; }
    }

Paso 5: Crear un  Formulario con una Grilla que pueda usar las 2 Funciones
Asumiendo que las 2 funciones estáticas fueron creadas en una clase llamada "ucTablaLista" y hemos creado un formulario llamado: "frmProducto" conteniendo un control DataGridView llamado: "dgvProducto" y 2 botones llamados: "btnDataTableALista" y "btnListaADataTable", tal como se muestra en la siguiente imagen:


Escribir el siguiente código en el formulario:

public partial class frmProducto : Form
    {
        private DataTable tabla;
        private List<beProducto> lista;

        public frmProducto()
        {
            InitializeComponent();
        }

        private void listarProductos(object sender, EventArgs e)
        {
            using (SqlConnection con = new SqlConnection("uid=UsuarioNW;pwd=123456;
            data source=NombreServidor;initial catalog=Northwind"))
            {
                try
                {
                    tabla = new DataTable();
                    lista = new List<beProducto>();
                    con.Open();
                    SqlDataAdapter dap = new SqlDataAdapter("Select ProductID,ProductName,
                      SupplierID,CategoryID,UnitPrice,UnitsInStock From Products", con);
                    dap.Fill(tabla);
                    dgvProducto.DataSource = tabla;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }

        private void btnDataTableALista_Click(object sender, EventArgs e)
        {
            lista = ucTablaLista<beProducto>.TablaALista(tabla);
            dgvProducto.DataSource = lista;
            this.Text = String.Format("Objetos en la Lista: {0}", lista.Count);
        }

        private void btnListaADataTable_Click(object sender, EventArgs e)
        {
            tabla = ucTablaLista<beProducto>.ListaATabla(lista);
            dgvProducto.DataSource = tabla;
            this.Text = String.Format("Filas en la Tabla: {0}", tabla.Rows.Count);
        }
    }

Paso 6: Ejecutar la aplicación y Probar
Para ejecutar la aplicación se tiene que cambiar la cadena de conexión: usuario, password y nombre del servidor, la base de datos usada es Northwind.


Descarga:
Demo03_Conversion_DataTable_Lista

Libro La Biblia de Visual Basic .NET - Preguntas de Repaso - Capítulo 3

Preguntas de Repaso: Accediendo a Datos con ADO .NET

1.    Qué es ADO .NET?

2.    Cuáles son los 2 componentes principales de ADO .NET?

3.    Menciona los 2 proveedores nativos de datos de ADO .NET.

4.    Menciona los 2 proveedores generales de datos de ADO .NET.

5.    Menciona las clases que debe implementar todo proveedor de datos?

6.    Porqué es importante  la cadena de conexión y con qué propiedad de la clase Connection se define?

7.    Cómo sería la cadena de conexión a una base de datos de SQL Server que tiene seguridad de Windows y hay una sola instancia instalada.

8.    Qué proveedor de datos se usa para conectarse a una base de datos de MS Access, un archivo de MS Excel o un archivo DBF?

9.    En qué se diferencia la cadena de conexión a una base de datos de MS Access de la de un archivo Excel?

10. Cómo se puede obtener las tablas de una base de datos de MS Access o las hojas de un archivo de MS Excel?

11. Cuál es la forma más eficiente de copiar gran cantidad de datos hacia SQL Server?

12. Con qué clase de .NET se implementa la copia masiva hacia una base de datos de MS SQL Server?

13. Con qué método de la clase Command se ejecutan comandos de selección de un valor?

14. Con qué método de la clase Command se ejecutan comandos de selección de una fila?

15. Con qué método de la clase Command se ejecutan comandos de selección de varias filas?

16. Con qué método de la clase Command se ejecutan comandos de selección de varias conjuntos de filas?

17. Cómo se llama la clase que permite almacenar una sola fila a la vez?

18. Cuál es la diferencia entre un DataReader y un DataSet?

19. Cómo se controlan los nulos mediante el DataReader?

20. Con qué método de la clase DataReader se puede leer el siguiente conjunto de registros en caso de ser varios Select?

21. Con qué método de la clase Command se ejecuta un comando que inserta, actualiza o elimina registros?

22. Qué es un DataSet y para que sirve?

23. Cuáles son los elementos de un DataSet?

24. Para que sirve el DataAdapter?

25. Con qué método del DataAdapter se crea un tabla en el DataSet desde un origen de datos?

26. Cómo se crea una vista o DataView?

27. Con qué propiedad del DataView se filtran registros?

28. Con qué propiedad del DataView se ordenan registros?

29. Con qué método del DataView se busca un registro por una clave?

30. Qué debe hacerse al DataView antes de realizar una búsqueda, sino se genera una excepción?

31. De qué formas se puede eliminar registros de un DataTable?

32. Cómo se pueden obtener los cambios realizados en un DataTable o DataSet antes de enviarlos hacia la base de datos?

33. Con qué método del DataAdapter se envían los cambios de regreso a la base de datos?

34. Cuál es la ventaja de trabajar desconectado usando Listas de Objetos en vez del DataSet?

35. Cómo se filtran objetos de una lista de objetos?

36. Cómo se ordenan objetos de una lista de objetos?

37. Cómo se buscan datos en una lista de objetos?

38. Menciona 3 métodos extendidos que permitan realizar cálculos en listas de objetos.

39. Para qué sirve LINQ y Cuántos tipos de LINQ existen?

40. De qué formas podemos acceder a bases de datos con LINQ?

41. Qué clases implementan LINQ a DataSets?

42. De qué formas se puede escribir la sintáxis de LINQ a DataSets?

43. Qué herramienta del Visual Studio se usa para implementar muchas características de LINQ a SQL?

44. Qué tipo de operaciones se pueden realizar con LINQ a SQL?

45. Qué es ADO .NET Entity Framework?

46. A qué convierte LINQ a Entidades las consultas de LINQ.

47. Cuáles son los pasos para crear y ejecutar una consulta de LINQ a Entidades?.

El Libro del Día: ASP.NET MVC 4 Recipes

El Libro del Día: 2014-06-16

Titulo: ASP.NET MVC 4 Recipes
Autor: John Ciliberti
Editorial: Apress
Nro Paginas: 619

Capítulos:
Chapter 1: The Need for Modern Web Applications
Chapter 2: Understanding ASP.NET MVC
Chapter 3: Setting Up Your Environment
Chapter 4: Visual Studio 2012 Overview
Chapter 5: Getting the Most from the Built-in Templates
Chapter 6: Architecting Applications with ASP.NET MVC
Chapter 7: Solution Design
Chapter 8: Asynchronous Programming with ASP.NET MVC
Chapter 9: Test-Driven Development with ASP.NET MVC 4
Chapter 10: Moving From Web Forms to ASP.NET MVC
Chapter 11: Creating Modern User Experiences Using jQuery, Knockout.js, and Web API
Chapter 12: Mobile, Social, and Cloud Technologies

Descarga:
ASP.NET_MVC4_Recipes