DTO A DATATABLE Y VICEVERSA
Video y codigo con correcciones
Hola a todos. Vamos a ver como podemos transformar los datos que provienen de un datatable a un objeto contenedor , que contienen DTOs con los datos.
Partiendo de la Base del DTO vamos a crear una clase con una funcion que transformara esos datos.
Lo primero es la clase DTO que vamos a utilizar que podria ser como esta.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
Public Class DTOCLIENTE Private _Id Public Property Id As Integer Get Return _Id End Get Set(value As Integer) _Id = value End Set End Property Private _Nombre Public Property Nombre As String Get Return _Nombre End Get Set(value As String) _Nombre = value End Set End Property Private _Apellidos Public Property Apellidos As String Get Return _Apellidos End Get Set(value As String) _Apellidos = value End Set End Property Public Sub New() End Sub End Class |
Pues bien , ya tenemos el DTO general , ahora necesitamos los datos,
los puedes haber obtenido usando OLEDB, ADODB. o como sea yo los creare a mano para el ejemplo.
Como vas a ver , coinciden los formatos de campo con los formatos de campo del DTO, esto es importante por que si no dara error.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Dim dt As New DataTable dt.Columns.Add("Id", GetType(Int32)) : dt.Columns.Add("Nombre", GetType(String)) : dt.Columns.Add("Apellidos", GetType(String)) Dim dr As DataRow dr = dt.NewRow dr("id") = 1 dr("Nombre") = "Juan" dr("Apellidos") = "Pardo" dt.Rows.Add(dr) dr = dt.NewRow dr("id") = 2 dr("Nombre") = "Lucas" dr("Apellidos") = "Martinez" dt.Rows.Add(dr) dr = dt.NewRow dr("id") = 3 dr("Nombre") = "Pablo" dr("Apellidos") = "Beltran" dt.Rows.Add(dr) dr = dt.NewRow dr("id") = 4 dr("Nombre") = "Maria" dr("Apellidos") = "Juliana" dt.Rows.Add(dr) dt.TableName = "Clientes" |
Ya tenemos la estructura DTO y el Datatable, pues ahora solo nos falta el convertidor, que yo , lo cree en una nueva clase, que se llama DTToDTO
(Datatable to DTO) cuya funcion es ToDTO al cual le pasamos el Datatable y el type del DTO. Primero el convertidor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Imports System.Reflection Public Class DTToDTO Public Sub New() End Sub Public Function ToDTO(ByVal dt As DataTable, ByVal Type As Type) 'Invocamos una instacia del type que va pasar a ser DTO Dim DTOBASE = Type.InvokeMember("new", Reflection.BindingFlags.CreateInstance, Nothing, Nothing, Nothing) 'Creamos el contenedor de retorno Dim DTORETURN(-1) For Each dr As DataRow In dt.Rows ReDim Preserve DTORETURN(UBound(DTORETURN) + 1) Dim DTOADD = DTOBASE For Each dc As DataColumn In dt.Columns Dim Pr As PropertyInfo = DTOADD.GetType.GetProperty(dc.ColumnName) Pr.SetValue(DTOADD, dr(dc.ColumnName), Nothing) Next DTORETURN(UBound(DTORETURN)) = DTOADD Next Return DTORETURN End Function End Class |
Y Ahora al contrario.
Lo primero que haremos sera crear una clase a la que yo llame DTOToDTT(DTO to Datatable) y Crearemos una funcion que yo llame ToDTT que tendra como variable un Object y el valor de retorno sera el datatable, y vamos a utilizar la misma logica con reflection la cosa de momento queda asi.
1 2 3 4 5 6 7 8 9 |
Imports System.Reflection Public Class DTOToDTT Public Sub New() End Sub Public Function ToDTT(ByVal DTOs As Object) As DataTable End Function End Class |
A continuación vamos trazar los siguientes pasos para no liarnos, de tal forma que quedara una secuencia logica.
1 Columnas y tipo de dato
2 Datos
Creamos el datatable y vamos a empezar a crear las columnas a traves del reflection, yo lo desglosare y saldrán mas lineas de codigo pero se puede hacer en 1 linea por cada columna del datatable.
1 2 3 4 5 6 |
Dim Dt As New DataTable For Each Pr As PropertyInfo In DTOs(0).GetType.GetProperties Dim NombreColumna = Pr.Name Dim TipoDato As Type = Pr.PropertyType Dt.Columns.Add(NombreColumna, TipoDato) Next |
La cosa va facil no??, creo que no necesita mucha explicación.
Bueno y ahora a rellenar los datos. Para ello vamos a repetir parte de la logica anterior añadimos un For para recorrer el Array y vamos creando los rows, como dije antes, lo voy a desglosar para que se entienda mejor,pero se puede hacer en menos lineas.
1 2 3 4 5 6 7 8 9 10 11 |
For i As Integer = 0 To DTOs.length - 1 Dim dr As DataRow dr = Dt.NewRow For Each pr As PropertyInfo In DTOs(i).GetType.GetProperties Dim NombreColumna = pr.Name Dim Valor = DTOs(i).GetType.GetProperty(NombreColumna).GetValue(DTOs(i)) dr(NombreColumna) = Valor Next Dt.Rows.Add(dr) Next Return Dt |
En 2 pasos, ya esta, ya lo tenemos resuelo. a continuacion os dejo todo el codigo completo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Imports System.Reflection Public Class DTOToDTT Public Sub New() End Sub Public Function ToDTT(ByVal DTOs As Object) As DataTable Dim Dt As New DataTable For Each Pr As PropertyInfo In DTOs(0).GetType.GetProperties Dim NombreColumna = Pr.Name Dim TipoDato As Type = Pr.PropertyType Dt.Columns.Add(NombreColumna, TipoDato) Next For i As Integer = 0 To DTOs.length - 1 Dim dr As DataRow dr = Dt.NewRow For Each pr As PropertyInfo In DTOs(i).GetType.GetProperties Dim NombreColumna = pr.Name Dim Valor = DTOs(i).GetType.GetProperty(NombreColumna).GetValue(DTOs(i)) dr(NombreColumna) = Valor Next Dt.Rows.Add(dr) Next Return Dt End Function End Class |
Enlace corto a este post http://4go.es/?4