viernes, 1 de junio de 2012

Cristhian Vergara (Otros)

Cristhian Vergara
Cristhian Vergara
Cristhian Vergara
Cristhian Vergara
Cristhian Vergara
Cristhian Vergara
Cristhian Vergara
Cristhian Vergara
Cristhian Vergara
Cristhian Vergara
Cristhian Vergara
Cristhian Vergara
Cristhian Vergara
Cristhian Vergara
Cristhian Vergara
Cristhian Vergara
Cristhian Vergara
Cristhian Vergara
Cristhian Vergara
Cristhian Vergara
Cristhian Vergara

Medir el tiempo de ejecución con la clase StopWatch


Medir el tiempo de ejecución con la clase StopWatch

0 comentarios
La clase StopWatch mide el tiempo transcurrido para un intervalo, o el total de tiempo de varios intervalos. Mediante los métodos Star, Stop y la propiedad Elapsed se determina el valor de tiempo transcurrido. Mas información en MSDN (http://msdn.microsoft.com/es-es/library/system.diagnostics.stopwatch.aspx)
Para este ejemplo, voy a realizar una consulta con ADO.NET y LINQ TO SQL, la idea es medir el tiempo de de acceso a datos. La tabla se llama MODELOAVION la cual contiene 53,330 filas o modelos de aviones.
image
La siguiente interface contiene dos botones; uno para ADO.NET y el otro para LINQ TO SQL, un par de etiquetas para mostrar el tiempo transcurrido y un DataGridView para ver los datos:
image

miércoles, 23 de mayo de 2012

Cambiar y Proteger la cadena de conexion del app.config


La cadena de conexión es un dato sensible, por tal razón es necesario protegerla, de aquellos usuarios emprendedores o alguno que te odie. Para ciertas aplicaciones se necesita modificar la cadena de conexión en tiempo de ejecución.
En siguiente formulario permite leer, cambiar en tiempo de ejecución y proteger  la cadena de conexión.
image
Agrego a mi proyecto el archivo app.config:
   1: <?xml version="1.0" encoding="utf-8" ?>
   2: <configuration>
   3:  
   4:   <connectionStrings>
   5:     <add  name="cnxVentasDemo"
   6:           connectionString="Server=(local)\SQL2008;DataBase=VentasDemo;Integrated Security=SSPI;"
   7:           providerName="System.Data.SqlClient" />
   8:   </connectionStrings>
   9:  
  10: </configuration>
Agrego la referencia a System.Configuration y el respectivo Imports:
   1: Imports System.Configuration
   2:  
   3: Public Class Form1
   4:  
   5:   
   6: End Class
El siguiente código permite la lectura de la cadena de conexión:
   1: Private Sub btnObtieneCNX_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnObtieneCNX.Click
   2:         Dim MiCnx As ConnectionStringSettings
   3:  
   4:         MiCnx = ConfigurationManager.ConnectionStrings("CNXVentasDemo")
   5:  
   6:         If Not MiCnx Is Nothing Then
   7:             txtCadenaConexion.Text = MiCnx.ConnectionString
   8:         End If
   9:     End Sub
Para proteger la cadena de conexión, se abrirá el app.config, luego la sección connectionsString y finalmente preguntar si la sección esta protegida o no.
   1: Private Sub btnProtegerCNX_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProtegerCNX.Click
   2:  
   3:        Try
   4:            'Se abre el app.config para recuperar la seccion ConnectionStrings
   5:            Dim MiAppConfig As Configuration = _
   6:            ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath)
   7:  
   8:            'Se recupera la seccion ConnectionStrings
   9:            Dim MiSeccion As ConnectionStringsSection = _
  10:            DirectCast(MiAppConfig.GetSection("connectionStrings"),  ConnectionStringsSection)
  11:  
  12:            'Se protege la seccion, caso contrario se desprotege
  13:            If MiSeccion.SectionInformation.IsProtected Then
  14:                MiSeccion.SectionInformation.UnprotectSection()
  15:            Else
  16:  
  17:                MiSeccion.SectionInformation.ProtectSection("DataProtectionConfigurationProvider")
  18:            End If
  19:  
  20:            'Se guarda los cambios
  21:            MiAppConfig.Save()
  22:  
  23:            If MiSeccion.SectionInformation.IsProtected Then
  24:                MessageBox.Show("Cadena de Conexion Protegida")
  25:            Else
  26:                MessageBox.Show("No esta protegida")
  27:            End If
  28:  
  29:        Catch ex As Exception
  30:            MessageBox.Show(ex.Message)
  31:        End Try
  32:    End Sub
La aplicación no necesita descifrar la sección connectionString, este paso es realizando automáticamente.
Para cambiar la cadena de conexión en tiempo de ejecución tenemos:
   1: Private Sub btnCambiarCNX_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCambiarCNX.Click
   2:        'Se abre el app.config para recuperar la seccion ConnectionStrings
   3:        Dim MiAppConfig As Configuration = _
   4:        ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath)
   5:  
   6:        'Se recupera la seccion ConnectionStrings
   7:        Dim MiSeccion As ConnectionStringsSection = _
   8:        DirectCast(MiAppConfig.GetSection("connectionStrings"), ConnectionStringsSection)
   9:  
  10:        'Se establece el nuevo valor de la cadena de conexion
  11:        MiSeccion.ConnectionStrings("CNXVentasDemo").ConnectionString = txtCadenaConexion.Text
  12:  
  13:        'Se guarda los cambios
  14:        MiAppConfig.Save()
  15:  
  16:        MessageBox.Show("Se guardo la cadena de conexion. Cierre la aplicación ó Reinicio la aplicación")
  17:  
  18:        'Se reinicia la aplicación
  19:        Application.Restart()
  20:  
  21:    End Sub
Es necesario reiniciar la aplicación o cerrarla, ya que la carga inicial se encuentra en la cache de la aplicación y por este motivo no se ve el cambio

martes, 22 de mayo de 2012

Para que sirve el patron Singleton?


Para que sirve el patron Singleton?


Antes de contestar la pregunta “¿Para que sirve el patrón Singleton?”; contestemos esta: ¿Qué es el patrónSingleton? , según Wikipedia:
El patrón de diseño Singleton (instancia única) está diseñado para restringir la creación de objetos pertenecientes a una clase o el valor de un tipo a un único objeto. Su intención consiste en garantizar que una clase sólo tenga una instancia y proporcionar un punto de acceso global a ella. (http://es.wikipedia.org/wiki/Singleton) En el articulo escrito por  León  Weliki para MSDN, profundiza sobre el tema en cuestión (http://msdn.microsoft.com/es-es/library/bb972272.aspx).
Resumiendo las definiciones, el patrón Singleton me asegura que solo se creará una única instancia de la clase. Contestando a la segunda pregunta, para que me sirve?. Empecemos a definir un contexto donde pueda aplicar este patrón;  normalmente las tablas de clientes y proveedores tienen un campo Distrito, que es el lugar donde se encuentra ubica la empresa. Es muy probable que en cada mantenimiento hagamos uso de la instancia de la clase Distrito con la finalidad de obtener los datos, entonces la conexión a la base de datos se hará varias veces cargando los mismos datos, pero en diferentes formularios, aquí podemos centralizar la carga de los datos por única vez, y que luego pueda ser usada en diferentes partes de la aplicación.
Se crea la clase Distrito que implemente el patrón Singleton:
   1: Imports System.Data.SqlClient
   2:  
   3: Public Class Distrito
   4:     Private Shared Instancia As Distrito = Nothing
   5:     Private dt As New DataTable
   6:  
   7:     'Se inicia el constructor por unica vez
   8:     Private Sub New()
   9:         Dim cnx As New SqlConnection("Server=.\SQL2008;Database=VentasDemo;Integrated Security=SSPI;")
  10:         Dim cmd As New SqlCommand("Select Cod_Dis, Nom_Dis From TB_Distrito Order By Nom_Dis", cnx)
  11:  
  12:         cnx.Open()
  13:         dt.Load(cmd.ExecuteReader)
  14:         cnx.Close()
  15:     End Sub
  16:     Public Shared Function getInstancia() As Distrito
  17:         If Instancia Is Nothing Then
  18:             Instancia = New Distrito()
  19:         End If
  20:         Return Instancia
  21:     End Function
  22:     Public Function GetDistritos() As DataTable
  23:         Return dt
  24:     End Function
  25: End Class
El método getInstancia asegura que la clase tenga una única instancia, por lo tanto el constructor se ejecuta una sola vez, es aquí donde colocare el código que carga los distritos de la base de datos, y los almacenare en un objeto DataTable. Observe  que por una sola vez se conectara a la base de datos para obtener los datos de distritos, para luego usarlo en toda la aplicación. El objeto Instancia me indicara si se creo la instancia de Distrito, caso contrario es nulo. El método GetDistritos devuelve el objeto DataTable, con los datos cargados.
Para probar la clase Distrito, creare tres formularios: FormMDI, que será mi formulario principal, Form1 que será el mantenimiento de Clientes y el Form2 será el mantenimiento de Proveedores. En cada formulario creare el objeto Distrito, pero solo en uno de ellos se crea la instancia.
image
Para el FormMDI, tengo el siguiente diseño:
image