4 ago. 2015

Entendiendo la estructura TimeSpan en C#

Una instancia de la estructura TimeSpan representa un periodo de tiempo pero también nos brinda una serie de propiedades y métodos útiles.

Para crear una instancia de TimeSpan tenemos varios constructores, por lo que deberemos buscar el más adecuado a nuestra necesidad.... podemos crear un TimeSpan a partir de ticks, o usando el constructor que más parámetros acepta, podemos crearlo a partir de un número de días, horas, minutos, segundos y milisegundos.

Otra forma de inicializar un TimeSpan es a partir se alguno de sus métodos estáticos cuyo nombre comienza con From, (Desde o A partir de en inglés), entonces podríamos inicializar untimeSpan a partir de un número de minutos usando TimeSpan.FromMinutes(double).

También podemos sumar y restar instancias de TimeSpan, pero como cada instancia es inmutable, el resultado de la operación lo asignaremos a otra variable.

Para realizar estas operaciones recurriremos al los métodos de instancia Add y Subtract los cuales aceptan un único parámetro de tipo TimeSpan, vamos un ejemplo de cada operación:

TimeSpan periodo1 = TimeSpan.FromHours(1);
TimeSpan periodo2 = TimeSpan.FromHours(3);

TimeSpan suma = periodo1.Add(periodo2); // suma representa un TimeSpan de 4 horas: 1 + 3

TimeSpan resta = periodo2.Subtract(periodo1); // resta representa un TimeSpan de 2 horas, 3 - 1



Algunas propiedades de TimeSpan son tan importantes como útiles a la hora de trabajar con intervalos de tiempo, me refiero a las propiedades que nos devuelven el valor de ese intervalo en cierta unidad, por ejemplo la cantidad de segundos totales correspondientes a ese periodo.
Estas propiedades son nombradas como TotalUnidadDeTiempo, por ejemplo TotalSeconds o TotalMinutes, veamos un ejemplo:

TimeSpan foo = TimeStamp.FromMinutes(2);
Console.WriteLine(foo.TotalSeconds.ToString()); // Se imprimirá 120



No debemos confundir estas propiedades con las que sólo reciben el nombre de la unidad de tiempo a la que representan, por ejemplo Hours o MilliSeconds, ya que éstas representan el valor de esa unidad, no la representación total del periodo en esa unidad.

Por ejemplo:

TimeSpan foo = TimeStamp.FromSeconds(70);
Console.WriteLine(foo.TotalSeconds.ToString()); // Se imprimirá 70
Console.WriteLine(foo.Seconds.ToString()); // Se imprimirá 10, ya que el TimeSpan representa un periodo de 1 minuto y 10 segundos



7 abr. 2015

Convertir Ticks en Fecha y viceversa

Hoy quisiera publicar un tip que es prácticamente tonto, pero dado que he recibido la consulta y la solución puede no resultar de lo más intuitiva, aquí dejo una función para convertir Ticks en Fecha y Fecha en Ticks.


Antes que nada, qué son Ticks?

Un tick es el mínimo valor que representa un paso, equivalente a 100 nanosegundos, o sea en un mili segundo hay 10.000 ticks.



Public Function TicksToDateTime(ticks As Long) As DateTime
   Return New DateTime(ticks) ' Intuitivo sería tener una función DateTime.FromTicks(Long)
End Function

Public Function DateTimeToTicks(date As DateTime) As Long
   Return date.Ticks
End Function


Como había anticipado, la solución es muy tonta!
En cuanto a tener una forma más intuitiva, podríamos crear un Método de Extensión, (Extension Method), que afecte la clase DateTime, de esa manera tener DateTime.FromTicks(Long).


19 nov. 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 jul. 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 jul. 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 sept. 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 ago. 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