lunes, 30 de enero de 2012

TRASPASAR DTO A DATATABLE

Hola a tod@s.
    
Esta vez veremos como pasar un DTO a un Datatable de solo 1 registro, y veremos tambien la situacion de pasar una coleccion de DTOs a un Datatable usando System.Reflection.

Este ejemplo lo hare con un DTO muy sencillito de tan solo 2 campos: IdCliente, Desccliente.

Primero rellenare el DTO.

   Dim Ndto As New Dto.DtoCliente
   Ndto.DescCliente = "PEPE"
   Ndto.IdCliente = "101"


Bien ahora vamos a crear una funcion que nos devuelva un Array de String la llamare GetCampos()
Que quedara de la siguiente manera.

    Private Function GetCampos(ByVal Dto) As String()
        'Array de string que devolvera los campo
        Dim Str(-1) As String
        For Each Prop As PropertyInfo In DirectCast(Dto, Object).GetType.GetProperties
            ReDim Preserve Str(UBound(Str) + 1)
            Str(UBound(Str)) = Prop.Name
        Next
        Return Str
    End Function


Bien ahora creamos la funcion que nos devolvera el Datatable , A esta funcion le tendremos que pasar los campos y el Dto.

    Private Function GetDataTable(ByVal Campos(), ByVal DTO) As DataTable
       
        Dim Dt As New DataTable
        For i As Integer = 0 To Campos.Count - 1
            Dt.Columns.Add(Campos(i))
        Next
       
        Dim Dr As DataRow = Dt.NewRow
        
        For Each Dc As DataColumn In Dt.Columns
            Dr(Dc.ColumnName) = DTO.GetType.InvokeMember(Dc.ColumnName, BindingFlags.GetProperty, Nothing, DTO, Nothing)
        Next
       
        Dt.Rows.Add(Dr)
        Return Dt
    End Function

y listo solo queda hacer la llamada para que devuelva un Datatable con 1 row.

Dim DtotoDatatable As DataTable = GetDataTable(misCampos, Ndto)

Aprovechado el primer DTO vamos a hacer una coleccion de DTOs y lo traspasaremos a un datatable.


Creamos la coleccion y añadimos.

        
        Dim MiColeccion As New Collection
        'añado el primer dto y creo otro
        MiColeccion.Add(Ndto)

        Ndto = New Dto.DtoCliente
        Ndto.IdCliente = "102"
        Ndto.DescCliente = "JUAN"

        MiColeccion.Add(Ndto)

Ahora a la funcion GetCampos le pasamos el primer DTO de la coleccion.
Dim CamposDeMiColeccion() As String = GetCampos(MiColeccion(1))

Creamos una nueva funcion para pasarle la coleccion y los campos, y que nos devuelva el datatable.
    Private Function GetDataTableColeccion(ByVal Campos() As String, ByVal Coleccion As Collection) As DataTable
        Dim Dt As New DataTable
        ''Campos sigue siendo igual.
        For i As Integer = 0 To Campos.Count - 1
            Dt.Columns.Add(Campos(i))
        Next
        '' recorremos la coleccion y vamos sacando los DTOs
        For i As Integer = 1 To Coleccion.Count
            Dim Dto = Coleccion(i)
            '' Ya tenemos los campos en nuestro datatable ahora lo rellenamos
            Dim Dr As DataRow = Dt.NewRow
            'recorro las columnas para ir rellenado los valores que tiene el DTO.
            For Each Dc As DataColumn In Dt.Columns
                Dr(Dc.ColumnName) = Dto.GetType.InvokeMember(Dc.ColumnName, BindingFlags.GetProperty, Nothing, Dto, Nothing)
            Next
            'y lo añado a el datatable
            Dt.Rows.Add(Dr)
        Next
        Return Dt
    End Function

Y listo, ya tenemos el datatable con la coleccion de  DTOs. Hacemos la llamada pertinente.

Dim miDatatable As DataTable = GetDataTableColeccion(CamposDeMiColeccion, MiColeccion)

Os dejo el codigo fuente completo del ejemplo Comentado.
Imports System.Reflection

Public Class DTOtoDT

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ''Este Dto es un ejemplo sencillo con solo 2 campos uno Idcliente y Otro Desccliente.
        Dim Ndto As New Dto.DtoCliente
        Ndto.DescCliente = "PEPE"
        Ndto.IdCliente = "101"
        ''primer ejemplo para dto 
        ''Vamos a crear ahora una funcion que nos devuelva las propiedades del DTO.
        ''que seran los campos del Datatable que vamos a crear deberemos tener importada 
        ''la referencia de system.Reflection.
        ''Lo que voy a hacer es devolverlos en un array de String

        Dim misCampos() As String = GetCampos(Ndto)
        Dim DtotoDatatable As DataTable = GetDataTable(misCampos, Ndto)

        '' ahora creare una funcion que me devuelva el Datatable con los campos del Array y los datos del DTO
        Dim MiColeccion As New Collection
        'añado el primer dto y creo otro
        MiColeccion.Add(Ndto)

        Ndto = New Dto.DtoCliente
        Ndto.IdCliente = "102"
        Ndto.DescCliente = "JUAN"

        MiColeccion.Add(Ndto)
        ''Nuestra Coleccion tiene ahora 2 DTOs y lo vamos a pasar nuestro datatable
        ''Vamos a buscar los campos dentro de la coleccion del 1er DTO.

        Dim CamposDeMiColeccion() As String = GetCampos(MiColeccion(1))
        ''Creo la funcion igual a la primera pero recorremos la coleccion.  
        Dim miDatatable As DataTable = GetDataTableColeccion(CamposDeMiColeccion, MiColeccion)

        'Y nuestro datatable tiene los Rows que pertenecen a la coleccion de DTOs.
    End Sub
    Private Function GetCampos(ByVal Dto) As String()
        'Array de string que devolvera los campo
        Dim Str(-1) As String
        For Each Prop As PropertyInfo In DirectCast(Dto, Object).GetType.GetProperties
            ReDim Preserve Str(UBound(Str) + 1)
            Str(UBound(Str)) = Prop.Name
        Next
        Return Str
    End Function
    Private Function GetDataTable(ByVal Campos(), ByVal DTO) As DataTable
        'DTO para Datatable de 1 Sola Linea
        Dim Dt As New DataTable
        For i As Integer = 0 To Campos.Count - 1
            Dt.Columns.Add(Campos(i))
        Next
        '' Ya tenemos los campos en nuestro datatable ahora lo rellenamos
        Dim Dr As DataRow = Dt.NewRow
        'recorro las columnas para ir rellenado los valores que tiene el DTO.
        For Each Dc As DataColumn In Dt.Columns
            Dr(Dc.ColumnName) = DTO.GetType.InvokeMember(Dc.ColumnName, BindingFlags.GetProperty, Nothing, DTO, Nothing)
        Next
        'y lo añado a el datatable
        Dt.Rows.Add(Dr)
        Return Dt
    End Function
    Private Function GetDataTableColeccion(ByVal Campos() As String, ByVal Coleccion As Collection) As DataTable
        Dim Dt As New DataTable
        ''Campos sigue siendo igual.
        For i As Integer = 0 To Campos.Count - 1
            Dt.Columns.Add(Campos(i))
        Next
        '' recorremos la coleccion y vamos sacando los DTOs
        For i As Integer = 1 To Coleccion.Count
            Dim Dto = Coleccion(i)
            '' Ya tenemos los campos en nuestro datatable ahora lo rellenamos
            Dim Dr As DataRow = Dt.NewRow
            'recorro las columnas para ir rellenado los valores que tiene el DTO.
            For Each Dc As DataColumn In Dt.Columns
                Dr(Dc.ColumnName) = Dto.GetType.InvokeMember(Dc.ColumnName, BindingFlags.GetProperty, Nothing, Dto, Nothing)
            Next
            'y lo añado a el datatable
            Dt.Rows.Add(Dr)
        Next
        Return Dt
    End Function
End Class
NOS HEMOS CAMBIADO ESTAMOS EN SOULSMAKERS.COM CON MUCHISIMOS CONTENIDOS VIDEOS Y EJEMPLOS
Un Saludo.

viernes, 27 de enero de 2012

COMO ENCRIPTAR CADENAS DE TEXTO VB.NET



Hola a tod@s. Os dejo un ejemplo simple de como encriptar cadenas de texto usando los ecriptados que vienen en VisualStudio 2008 y 2010.

El ejemplo que Publico es para encriptar con el formato MD5.

Nos creamos un formulario simple de windows y añadimos los controles necesarios. Os dejo el ejemplo.





Ahora nos vamos al codigo y importamos las siguientes Namespaces.

Imports System.Text
Imports System.Security.Cryptography


En el evento de button click añadimos lo siguiente. 

 Dim Codificar As New UnicodeEncoding() 
 Dim BytesTexto() As Byte = Codificar.GetBytes(me.textbox1.text)
 
Dim Md5 As New MD5CryptoServiceProvider()
 
Dim TablaBytes() As Byte = Md5.ComputeHash(BytesTexto)
 Me.Label1.Text = Convert.ToBase64String(
TablaBytes).ToString
 Codificar = Nothing
 ByteTexto =
Nothing

Si todo es correcto podemos ejecutar y escribir algo en la caja de texto, y nos devolvera el MD5.



Os dejo una imagen de uno generando varios tipos de encriptacion y con caracteres aleatorios. 


NOS HEMOS CAMBIADO ESTAMOS EN SOULSMAKERS.COM CON MUCHISIMOS CONTENIDOS VIDEOS Y EJEMPLOS

Un Saludo.