Liberar memoria con VB.Net

A pesar de que es recomendado dejar que el Garbage Collector (Recolector de basura para los amantes del español) haga el trabajo "sucio" dentro de un aplicativo VB, muchas veces éste parece estar de huelga o algo por el estilo, pero resulta haciendo una porquería de trabajo.
Si estas al borde de la desesperación, imagino que este código podría ayudarte un poco.

'Declaración de la API
Private Declare Auto Function SetProcessWorkingSetSize Lib “kernel32.dll” (ByVal procHandle As IntPtr, ByVal min As Int32, ByVal max As Int32) As Boolean
'Funcion de liberacion de memoria
Public Sub ClearMemory()
   Try
       Dim Mem As Process
       Mem = Process.GetCurrentProcess() SetProcessWorkingSetSize(Mem.Handle, -1, -1)

   Catch ex As Exception
   'Control de errores
   End Try
End Sub


Fuente: http://gdev.wordpress.com/2005/11/30/liberar-memoria-con-vb-net/

Probar procedures en SQL

Ésta entrada será muy corta.

Hace algún tiempo me dijeron "tienes que optimizar este procedure", así que lo analicé, hice algunas mejoras, y en la primera corrida del procedure, demoró aproximadamente 3 veces más de lo que demoraba el procedure original, pensé que había un error dado a que había aplicado (según yo) las "buenas prácticas", así que lo ejecuté denuvo y demoró la mitad del procedure original.

Que pasó? Sencillo, el caché y el buffer.

Tengan en cuenta que la ventaja de un procedure, es que compila la consulta y la guarda compilada, (es por eso que es una muy buena práctica el usuarlos) y lo que pasó fue que en la primera ejecución de mi modificación, es procedure tuvo que eliminarse y volverse a compilar.

Buscando un poco con internet, di con un método que me ayudaría un poco con esto de los tiempos (dejando de lado el usar el analizador de querys obviamente) y es el hecho de simplemente limpiar el caché y el buffer antes de ejecutar el procedure y esto se hace con los siguientes métodos

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE


Saludos

Parpadeo tipo msn VB.Net

Muchas veces me pregunté como es que se hace para que las ventanas del msn (que normalmente están minimizadas) empiecen a parpadear (lo que se considera una alerta).

Buscando un poco por internet, me encontré con una web que lo explicaba.

Aquí el código:

Este efecto es, por ejemplo, el que vemos cuando alguien nos escribe en una conversación de Messenger que tenemos minimizada.

flash_window.gif

El Net Framework no nos provee un método para lograr dicho efecto por ende la alternativa obligada es recurrir a la API de Windows. El nombre de nuestra función es FlashWindowEx alojada en User32.dll y su utilización es de lo más sencilla. La declaración a incluir es:

<DllImport(“user32.dll”)> _
Public Shared Function FlashWindowEx(ByRef pfwi As FLASHWINFO) As Integer
End Function

Y para su invocación solo se debemos completar la siguiente estructura que será pasada como parámetro:

<StructLayout(LayoutKind.Sequential)> _
Structure FLASHWINFO
    Dim cbSize As Integer
    Dim hwnd As System.IntPtr
    Dim dwFlags As Integer
    Dim uCount As Integer
    Dim dwTimeout As Integer
End Structure


Miembros de la estructura FLASHWINFO: 

  1. cbSize = peso en bytes de la estructura.
  2. hwnd = handler de la ventana sobre la cual actuamos.
  3. dwFlags = opciones que definirán el comportamientos de la función.
  4. uCount = cantidad de parpadeos deseados.
  5. dwTimeout = frecuencia en milisegundos del parpadeo.
    Constantes utilizadas para el seteo del miembro dwFlags.

    Private Const FLASHW_STOP As Integer = &H0
    Private Const FLASHW_CAPTION As Integer = &H1
    Private Const FLASHW_TRAY As Integer = &H2
    Private Const FLASHW_ALL As Integer = (FLASHW_CAPTION Or FLASHW_TRAY)
    Private Const FLASHW_TIMER As Integer = &H4
    Private Const FLASHW_TIMERNOFG As Integer = &HC

    Significado de cada una de las constantes:
    1. FLASHW_STOP = Detiene el parpadeo. El sistema devuelve la ventana a su estado original.
    2. FLASHW_CAPTION = Hace que parpadee la barra de título ventana.
    3. FLASHW_TRAY = Hace que parpadee el botón de la barra de tareas de una ventana.
    4. FLASHW_ALL = Suma lógica de las dos anteriores, con lo cual hace que parpadeen la barra de titulo y el botón de la barra de tareas de una ventana.
    5. FLASHW_TIMER = Hace que parpadee continuamente hasta que se llame a la funcion con FLASHW_STOP.
    6. FLASHW_TIMERNOFG = Hace que parpadee continuamente hasta que la ventana tome el foco.

      Ahora si queremos hacer que el caption de nuestra ventana comience a parpadear …
      Dim FlashInfo As FLASHWINFO

      With FlashInfo


      .cbSize = Convert.ToUInt32(Marshal.SizeOf(GetType(FLASHWINFO)))

      .dwFlags = CType(FLASHW_ALL Or FLASHW_TIMER, Int32)

      .hwnd = Me.Handle

      .dwTimeout = 0

      .uCount = 0

      End With

      FlashWindowEx(FlashInfo)

      Cuando queramos que deje de parpadear no tenemos mas que llamar a FlashWindowEx seteando previamente el flag FLASHW_STOP en la estructura FLASHWINFO.

      Dim FlashInfo As FLASHWINFO


      With FlashInfo

      .cbSize = Convert.ToUInt32(Marshal.SizeOf(GetType(FLASHWINFO)))

      .dwFlags = CType(FLASHW_STOP, Int32)

      .hwnd = Me.Handle

      .dwTimeout = 0

      .uCount = 0

      End With

      FlashWindowEx(FlashInfo)

      Ultimas consideraciones:
      1. Si dwTimeout es cero, la funcion utiliza la frecuencia establecida para el parpadeo del cursor en las opciones de teclado.
      2. Al utilizar el flag FLASHW_TIMERNOFG no es necesario llamar con FLASHW_STOP para detenerlo, basta con enfocar la ventana.

      Fuente:
      http://puntobit.wordpress.com/2007/12/01/parpadeo-del-titulo-de-ventana-en-vbnet-flashwindowex/

      Nota:
      Si deseas un poco más de información, también puedes visitar esta web
      http://geeks.ms/blogs/lmblanco/archive/2008/04/02/ventanas-parpadeantes-con-flashwindowex-y-ii.aspx

      Ejecutar procedure dentro de transacción

      Muchas veces, cuando ejecutamos un procedure, necesitamos que si hay algún error dentro de todo el proceso, todo lo que se ha hecho hasta el momento, se revierta.

      Para esto, es que existen las transacciones

      Código C#

      internal int Insertar(BE_Plantilla pBE_Plantilla)
      {
        int mintReturn = 0;
        int mint = 0;
        int lintCod_Return = 0;
        
        SqlConnection mcn = (SqlConnection)FactoriaConnection.GetConnection(DbConnectionId.SQL);
        SqlCommand mcmd = new SqlCommand("PGCSI_PLANTILLA", mcn);
        try
        {
          mcn.Open();
          SqlTransaction mtr = mcn.BeginTransaction();
          mcmd.Transaction = mtr;
          mcmd.CommandType = CommandType.StoredProcedure;
          
          mcmd.Parameters.Add("@DES_PLANTILLA", SqlDbType.VarChar).Value = pBE_Plantilla.Des_Plantilla;
          mcmd.Parameters.Add("@ESTADO", SqlDbType.VarChar).Value = pBE_Plantilla.Estado;               
          
          mcmd.Transaction = mtr;
          mintReturn = (int)mcmd.ExecuteNonQuery();
          
          if (mintReturn > 0)
          {
            mtr.Commit();
          }
          else
          {
            mtr.Rollback();
          }
        }
        catch (Exception ex)
        {
          mintReturn = -2;
        }
        finally
        {
          if (mcn.State == ConnectionState.Open)
            mcn.Close();
          mcn.Dispose();
          mcmd.Dispose();               
        }
        return mintReturn;
      }


      Si desean el código vb.net, me lo piden y lo transformo.

      De amor y otras tonterías - Parte 1: Inocencia

      Antes de empezar:
      Siempre quise hacer una historia, mezclando un poco (o mucho) de mis experiencias, con una que otra alucinada mía, y creo que ha llegado el momento de hacerlo.
      Para que tengan una referencia, sería algo parecido al conocido blog y libro "Busco novia".
      En realidad me encantarían sus comentarios, aunque sea para decir, tu historia es muy corta, o muy larga, o le falta esto, o le falta aquello. Prometo tomarlo como un sano consejo para ir mejorando las futuras historias.
      Así que sin más que decir, veamos que surge.
      PD: Obviamente todos los nombres vertidos en la historia serán cambiados para evitar inconvenienes

      Atracción a primera vista

      Existen personas (en mi caso, mujeres) a las cuales solo te basta conocer 5 minutos para empezar a alucinarte una relación larga y feliz con ella (sí, puede sonar algo exagerado, pero a mi me pasa de esa manera), y es que podría considerarse que se genera una "química" demasiado buena, demasiado "rica".

      Clase de conexión VB.Net a SQL

      Siempre es bueno tener a la mano una clase que encapsule todos los métodos de conexión con la BD, aqui les dejo una alternativa que yo siempre uso.

      Obviamente tendrán que exportar los parámetros de conexion a un archivo .ini o xml si es que les parece más sencillo.

      Imports System.Data
      Imports System.Data.SqlClient
      Imports System.Text
      
      Module modConeccion
         Private cn As SqlConnection
         Private da As SqlDataAdapter
         Private dt As DataTable
         Private cm As SqlCommand
         Private dr As SqlDataReader
      
         Public Enum TipoProcesamiento
             NonQuery = 1
             Scalar = 2
             DataTable = 3
         End Enum
      
      
         Public Sub GeneraCadena(ByVal cServidor As String, ByVal cBase As String, ByVal cUsuario As String, ByVal cPassword As String)
             cn = New SqlConnection("Server=" & cServidor & ";Database=" & cBase & ";Uid=" & cUsuario & ";Pwd=" & cPassword & ";")
         End Sub
      
         Public Sub Conectar()
             GeneraCadena({SERVIDOR}, {BD}, {USUARIO}, {PASSWORD})
             cn.Open()
         End Sub
      
         Public Sub Desconectar()
             cn.Close()
             'cn.Dispose()
         End Sub
      
         Public Function EjecutarConsulta(ByVal cConsulta As String, ByVal cTipoProceso As TipoProcesamiento, Optional ByVal bAlerta As Boolean = True) As Object
             Try
                 Conectar()
                 If cTipoProceso = TipoProcesamiento.NonQuery Then
                     cm = New SqlCommand(cConsulta, cn)
                     cm.ExecuteNonQuery()
                     Return True
                 ElseIf cTipoProceso = TipoProcesamiento.Scalar Then
                     cm = New SqlCommand(cConsulta, cn)
                     Return cm.ExecuteScalar()
                 ElseIf cTipoProceso = TipoProcesamiento.DataTable Then
                     da = New SqlDataAdapter(cConsulta, cn)
                     dt = New DataTable()
                     da.Fill(dt)
                     Return dt
                 Else
                     Throw New Exception("Tipo de procesamiento no válido")
                 End If
             Catch ex As Exception
                 If bAlerta = True Then
                     MsgBox("Error: " & ex.Message, MsgBoxStyle.Critical, "Error")
                 End If
                 Return Nothing
             Finally
                 Desconectar()
             End Try
         End Function
      
         Public Function EjecutarProcedure(ByVal cNombreProcedure As String, ByVal pParametros() As SqlParameter, ByVal cTipoProceso As TipoProcesamiento, Optional ByVal bAlerta As Boolean = True) As Object
             Try
                 Conectar()
                 Dim cm As New SqlCommand
                 cm = New SqlCommand(cNombreProcedure, cn)
                 cm.CommandType = CommandType.StoredProcedure
                 cm.Parameters.AddRange(pParametros)
      
                 If cTipoProceso = TipoProcesamiento.NonQuery Then
                     cm.ExecuteNonQuery()
                     Return True
                 ElseIf cTipoProceso = TipoProcesamiento.Scalar Then
                     Return cm.ExecuteScalar
                 ElseIf cTipoProceso = TipoProcesamiento.DataTable Then
                     da = New SqlDataAdapter(cm)
                     dt = New DataTable()
                     da.Fill(dt)
                     Return dt
                 Else
                     Throw New Exception("Tipo de procesamiento no válido")
                 End If
             Catch ex As Exception
                 If bAlerta = True Then
                     MsgBox("Error: " & ex.Message, MsgBoxStyle.Critical, "Error")
                 End If
                 Return Nothing
             Finally
                 Desconectar()
             End Try
         End Function
      End Module


      Reemplazar los datos de conexion (encerrados por {}) de acuerdo a tus necesidades

      Amores Platónicos

      A cierta edad, los amores platónicos (actrices, cantantes, modelos, etc) marcan una etapa en nuestra vida, obviamente unos mas superficiales que otros.

      Pero que pasa cuando conoces a tu amor platónico, cuando esa persona (en mi caso chica, obviamente ^^) está tan "cerca" de ti, pero obviamente, te ve y te trata tan solo como el super amigo, como el casi hermano, al que le cuenta toda su vida y todo lo que le hace el idiota con el que tiene una relación.

      Bienvenida

      El estudiar informática te robotiza un poco, te hace ser calculador, te hace pensar como un máquina ya que tienes q hacerle entender a una máquina lo que quieres que haga.

      Un informático normalmente cuenta chistes que sólo otros informáticos entienden, las conversaciones más exitantes son sobre informática y muchos de sus sueños tienen que ver con...? Sí, adivinaron, la informática.

      Pero fuera de esa pasión seguimos siendo humanos, por lo q también reimos, también lloramos, tambien nos parten el corazón (y luego lo tiran al suelo, lo pisotean, le pasan una aplanadora y lo incendian), también tenemos temores y también tenemos anecdotas.

      Este blog pretende encontrar un equilibro entre mis experiencias como programador (pondré códigos, articulos, videos, chistes, etc) que quizas le sirvan solamente a otros programadores, pero también compartiré parte de mi, parte de la vida de César Bravo.

      Creo que no queda nada más que decir, salvo el hecho de esperar que mis post sean totalmente de su agrado

      Muchas gracias por todo