viernes, 2 de septiembre de 2011

.NET SERIALIZATION C#

El proceso de serializacion consiste en almacenar una instancia de una clase en un archivo de manera tal que pueda volver a crearse el objeto con sus mismas propiedades cargándolo desde el mismo archivo; es decir si tienes un objeto creado en memoria el cual representa a un automóvil y deseas almacenar el objeto completo para luego volver a hacer referencia a él en otro momento, entonces deberías utilizar serializacion.
Vamos a ver como funciona el proceso de serializacion en .Net
Para nuestro estudio vamos a suponer que tenemos una clase llamada Persona la cual tiene como propiedades el Nombre, el apellido y la Cedula(Numero único de identificación) de la persona.
Para poder serializar una clase esta debe estar marcada con el atributo [Serializable]
[Serializable]
class Persona
        {
            public string _Nombre;
            public string _Apellido;
            public string _Cedula;
                      
        }


El siguiente paso consiste en elegir el tipo de serializador que necesitamos teniendo dentro de nuestras opciones el serializador binario, el serializador xml y otros soportados por el espacio de nombres System.Runtime.Serialization.


Serializador Binario:



 Persona nuevaPersona = new Persona();
            nuevaPersona._Nombre = "Carlos Andres";
            nuevaPersona._Apellido = "Arango Morales";
            nuevaPersona._Cedula = "xxx xxx xxx";


            //Se crea una instancia del formateador binario que implementa la interfaz IFormater
            IFormatter Formatter = new BinaryFormatter();

            //Cramos un Stream para almacenar el archivo en el disco
            Stream stream = new FileStream("PersonaSerializada.bin", FileMode.Create, FileAccess.Write, FileShare.None);

            //Utilizamos el Formatter para serializar el objeto en el stream

            Formatter.Serialize(stream, nuevaPersona);
            stream.Close();



De esta forma tendríamos en la carpeta de la aplicación un nuevo archivo llamado PersonaSerializada.bin con caracteres no fácilmente comprensibles por los humanos pero en el cual esta almacenado el objeto.


Deserializador Binario:



Si deseamos leer el objeto desde el archivo entonces debemos leer el archivo utilizando un Stream Reader para luego por medio del Formatter realizar un Cast al tipo de objeto a los datos retornados por el Formatter.


 IFormatter Formatter2 = new BinaryFormatter();
            Stream stream2 = new FileStream("PersonaSerializada.bin", FileMode.Open, FileAccess.Read, FileShare.Read);

            //Esta es la parte importante
            //Despues de tener el objeto en el stream creamos el objeto declarando el contenedor y realizando
            //un Cast del contenido del stream a la clase que deseamos deserializar

            Persona PersonaDesSerializada = (Persona) Formatter2.Deserialize(stream2);


Ahora tenemos en memoria en el objeto PersonaDesSerializada el contenido del objeto persona creado inicialmente.


Existen varios de tipos de serializadores los cuales son importantes y mas efectivos en algunos casos pero el proceso es muy similar al que vimos en este apartado del blog.





El código completo lo pueden encontrar en este link Serializacion












lunes, 11 de julio de 2011

Como acceder a tablas en diferentes bases de datos utilizando SQL SERVER (LINKED SERVERS)

En algún momento de nuestras vidas como desarrolladores vamos a necesitar realizar alguna consulta que requiera múltiples origenes de datos; es decir traer información de la tabla A en el Servidor 1 y datos de la tabla B en el servidor 2 para luego por ejemplo unirlas o realizar un join o lo que se les ocurra.

Para esto sql server trae la tecnología Linked Servers la cual permite enlazar diferentes orígenes de datos ODBC y consultarlos en el servidor como si fuesen locales tan solo agregando el descriptor del origen en la consulta

por ejemplo:

si deseamos consultas la tabla empleados desde nuestro servidor pero esta se encuentra en otro servidor; podriamos realizarlo de la siguiente forma

SELECT * FROM ServidorFicticio.dbo.Empleados

donde ServidorFicticio es el nombre de la instancia de servidor asociado actual

Este tipo de consultas son llamas consultas distribuidas y pueden ser muy utiles para homogenizar entornos de bases de datos heterogeneos como se puede apreciar en la siguiente imagen cortesia de nuestros amigos de Microsoft




Para mas informacion acerca de este tema pueden navegar en los siguientes links

Linking Servers
Creando Linked Servers

martes, 22 de febrero de 2011

Sumar dias o semanas o meses a una fecha en .net

Cuando estamos desarrollando aplicaciones en .net en ocasiones necesitamos sumar o restar algunas cantidades a las fechas actuales para esto .net trae un metodo el cual nos facilitara mucho la vida


por ejemplo

si quieres sumar un dia a una fecha


Dim ProximoDia as date
Dim DiaActual as date = system.datetime.time.now
ProximoDia = DiaActual .AddDays(1)


Puedes utilizar intelisense para ver los metodos que puedes utilizar para sumer meses años y demas


tambien puedes utilizar el metodo DateAdd



De la documentación de MSDN

DateAdd Function
Returns a Date value containing a date and time value to which a specified time interval has been added.

algunos ejemplos de MSDN

Example

This example takes a date and, using the DateAdd function, displays a corresponding date a specified number of months in the future.


Dim Msg, Number, StartDate As String 'Declare variables.
Dim Months As Double
Dim SecondDate As Date
Dim IntervalType As DateInterval
IntervalType = DateInterval.Month ' Specifies months as interval.
StartDate = InputBox("Enter a date")
SecondDate = CDate(StartDate)
Number = InputBox("Enter number of months to add")
Months = Val(Number)
Msg = "New date: " & DateAdd(IntervalType, Months, SecondDate)
MsgBox (Msg)