19 de nov. de 2013

Trace, la herramienta versátil para crear logs

Algo que siempre necesitamos es llevar líneas de log para saber qué está ocurriendo con nuestras aplicaciones y esto se vuelve prácticamente indispensable al trabajar con Windows Services o Servicios de Windows ya que al no tener UI se hace muy difícil saber qué ocurre...

Afortunadamente encontramos la clase Trace en el namespace System.Diagnostics, la cual nos permite de manera muy sencilla ir dejando líneas de log en nuestro código, veamos un ejemplo simple:


   Public Sub New()
      System.Diagnostics.Trace.WriteLine("Inicio de constructor")
      ' Proceso de datos
      System.Diagnostics.Trace.WriteLine("Fin de constructor")
   End Sub

Entonces para el propósito de este post lo que nos interesa es básicamente la capacidad de escribir de esta clase, para lo cual utilizaremos 2 métodos: Write() y WriteLine() cuya principal diferencia, como lo indica su nombre, es que uno escribe y el otro escribe y termina la línea.

Entonces ya sabemos como utilizar esta herramienta para escribir líneas de log, nos resta leer nuestro log, para lo cual Visual Studio cuenta con una ventana llamada Output o Salida (CTRL + W + O) en la cual se van imprimiendo las líneas de nuestro log... impecable si estamos trabajando en nuestro entorno de desarrollo, pero si debemos leer nuestro log desde una aplicación ya compilada (en modo Debug) podemos utilizar la herramienta Debug View que nos permite tener una ventana con nuestro log en la cual podremos usar filtros, resaltado de colores, etc.


23 de jul. de 2012

SQL Server Error 4064 - La solución

Si bien éste no es un tip de .Net, sino que es de SQL Server, me pareció útil compartirlo.
No se puede abrir la base de datos predeterminada del usuario. Error de inicio de sesión.

Este error ocurre cuando intentamos iniciar sesión en SQL Server con un usuario cuya base de datos por defecto fue eliminada del servidor.
En un servidor muy cerrado en cuanto a su seguridad, este problema puede dar la impresión de ser muy dificil de resolver, y más si se trata del único usuario con el que tenemos acceso al servidor.


Sin embargo la solución en muy sencilla, en el SQL Server Management Studio, (Express o no), buscamos en el diálogo de inicio de sesión el botón "Opciones" con lo cual accederemos a las opciones de la conexión que deseamos abrir.

A continación nos ubicamos en la pestaña "Propiedades de la conexión" y buscamos el campo "Conectar con base de datos", el cual mostrará el valor , borramos ese valor y escribimos master, (o cualquier nombre válido de base de datos a la cual tengamos acceso en el servidor), hacemos click en el botón Conectar y listo!


7 de jul. de 2012

Tip: Cómo saber cuántos días tiene un año en .Net?

Algunos programadores no lo tienen en cuenta, otros simplemente nunca lo necesitaron y otros no lo pensaron hasta que se chocaron con el problema... pero es un tip que puede ser útil, Cómo saber cuántos días tiene un año?

La respuesta se encuentra en la clase Calendar, del namespace System.Globalization, la cual contiene varios métodos y funciones de ayuda para operaciones de tiempo, pero la que nos importa en este momento es Calendar.GetDaysInYear(int Year).

Su uso? Depende de lo que necesitemos, pero a mi entender lo más lógico es utilizar la instancia de Calendar que se encuentra instanciada en nuestra CurrentCulture, por lo que se utilizaría de la siguiente manera:


En VB.Net:

Dim DiasDelAnio As Integer = CultureInfo.CurrentCulture.Calendar.GetDaysInYear(aux.Year)


En C#

int diasDelAnio = CultureInfo.CurrentCulture.Calendar.GetDaysInYear(aux.Year)

17 de sept. de 2010

Como hacer un servicio de Windows auto instalable

Todos nos hemos encontrado en la situación de tener que instalar un servicio, y utilizar el comando installutil.exe, pero por qué no ahorrarnos un paso y hacer que el servicio sea auto instalable?



Este tip no tiene mayor secreto, simplemente es un atajo al installutil.exe dentro del ejecutable de nuestro servicio.

Lo que haremos será ir a la clase Program.cs en C# o Módulo Main.vb eb VB y modificar el método main de la siguiente manera:


static class Program
{
///
/// The main entry point for the application.
///

static void Main(String[] args)
{
if (args.Length > 0)
{
switch (args[0])
{
case "/install":
install();
break;
case "/uninstall":
uninstall();
break;
}
}
else
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new SecurityProviderService() };
ServiceBase.Run(ServicesToRun);
}
}
}


Lo que hicimos fue agregarle a nuestro ejecutable la posibilidad de recibir parámetros, en éste caso /install o /uninstall, sólo nos resta crear los métodos para ejecutar éstas acciones y listo.


// Devuelve la ruta a installutil.exe
private static String installUtill()
{
return System.IO.Path.Combine(System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(), "installutil.exe");
}

private static void uninstall()
{
if (System.IO.File.Exists(installUtill()))
{
System.Diagnostics.Process.Start(installUtill(), String.Format("/u \"{0}\"", System.Reflection.Assembly.GetExecutingAssembly().Location));
System.Diagnostics.Trace.WriteLine("Service uninstalled.");
}
else
throw new System.IO.FileNotFoundException("InstallUtil.exe not found");
}

private static void install()
{
if (System.IO.File.Exists(installUtill()))
{
System.Diagnostics.Process.Start(installUtill(), String.Format("\"{0}\"", System.Reflection.Assembly.GetExecutingAssembly().Location));
System.Diagnostics.Trace.WriteLine("Service installed.");
}
else
throw new System.IO.FileNotFoundException("InstallUtil.exe not found");
}


Muy simple, ahora cuando necesitemos instalar nuestro servicio simplemente lo haremos desde una consola ejecutando NombreDelServicio.exe /install

16 de ago. de 2010

Referencia de atajos de teclado para Visual Studio 2010

Desde la web de Microsoft, nos ofrecen una serie de archivos PDF con los atajos de teclado para Visual Studio 2010.

C# shortcuts para Visual Studio 2010

Descargar

14 de oct. de 2009

Como acceder a la propiedad Text de un control NumericUpDown

Problema con NumericUpDown y la propiedad Text

Hoy me encontré con un problemita trabajando sobre un formulario que contiene varios NumericUpDown. El tema es que se podía seleccionar un valor, luego borrarlo y el sistema no hacía una validación que indicara al usuario que debía introducir un valor.

Al empezar a hacer pruebas noté que el texto queda vacío, pero el valor no cambia, o sea que si el NumericUpDown tiene un valor de 75 y le borramos el texto, al acceder a la propiedad Value del mismo, ésta nos devuelve 75.

El problema para solucionar ese bug me lo encontré cuando intenté acceder a la propiedad Text, para chequear que la misma no contenga un String vacío... Oh sorpresa, no se puede acceder a esa propiedad porque es privada!!

Para acceder a la propiedad Text aprovecharemos de la herencia de esta clase, NumericUpDown es una subclase de Control, entonces al hacer un cast podemos acceder a la propiedad Text para hacer el chequeo.
Esto nos permite varias soluciones posibles, una que me pareció bastante elegante fue asignar un event handler, o manejador de eventos al evento TextChanged, al cual también accederemos mediante un cast a Control.


Solución:


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For Each c As Control In Me.Controls
If TypeOf c Is NumericUpDown Then
AddHandler c.TextChanged, AddressOf NumericUpDownControls_TextChanged
End If
Next
End Sub

Private Sub NumericUpDownControls_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs)
If CType(sender, Control).Text = String.Empty Then
CType(sender, Control).Text = CType(sender, NumericUpDown).Value.ToString()
End If
End Sub



Otra posible solución, más eficiente desde el punto de vista de reusabilidad sería crear un control que herede de NumericUpDown y ya implemente de por si este comportamiento; que a mi entender es una falta de parte del equipo que desarrolló el control.

8 de jun. de 2009

Deshabilitar el Cortar / Copiar de líneas vacías en Visual Studio

Un comportamiento muy molesto de Visual Studio es cuando por error copias o cortas una línea vacía, o sin seleccionar nada... hasta hace un tiempo pensaba que era el comportamiento normal del IDE, pero un día hurgando en la ventana de opciones me encontré con que se puede desactivar.

Evitar copiar sin seleccionar en Visual Studio