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
Blog de Luis Dueñas dedicado a la difusión del Desarrollo en Microsoft .NET, Visual Studio, WinForms, WebForms, MVC, ASP .NET, jQuery, AJAX, HTML5, JavaScript, Móviles, etc. Encontrarás Libros, Demos, Artículos Técnicos, Entrenamiento.
lunes, 16 de junio de 2014
El Demo del Día: Convertir DataTable en Lista de Objetos y Viceversa
Etiquetas:
.NET,
ADO .NET,
C#,
DataTable,
Demos,
Lduenas,
Listas de Objetos,
Reflection,
WinForms
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?
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?.
Etiquetas:
.NET,
ADO .NET,
Entrenamiento,
La Biblia de Visual Basic .NET,
Lduenas,
Libros,
LINQ,
Preguntas de Repaso,
Visual Basic .NET
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
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
Etiquetas:
Apress,
ASP .NET,
John Ciliberti,
jQuery,
Libros,
MVC,
Visual Studio,
Web API
Suscribirse a:
Entradas (Atom)