viernes, 18 de enero de 2013

Super control de usuario

Los controles de usuario de Windows

Hoy ha pasado una cosa curiosa, un compi había creado una control de usuario que en el load hacia una consulta a la base de datos. Hasta aquí todo parece normal. Lo que ya no lo era tanto era si:
  1. Compilabas el proyecto
  2. En el Designer del formulario que lo contenía, en modo diseño se ejecutaba la consulta!!!
Por lo visto no es tan novedoso, aquí un ejemplo explicado lo mismo pero para el evento paint http://el-blog-de-thor.blogspot.com.es/2009/09/infectar-codigo-fuente.html

lunes, 14 de enero de 2013

DateTime.Parse & Marzo

Hoy hemos visto un error super curioso, leemos un fichero plano donde las fechas llegan con el formato dd-MMM-yy ( el formato no está decidió por nosotros)

Resulta que en una aplicación

fecha = DateTime.Parse("20-JAN-09") funciona
fecha = DateTime.Parse("20-MAR-09") falla No se puede reconocer la cadena como valor DateTime válido.

El problema parece ser en que no sabe si “MAR” es Marzo o Martes y da un error que no puede convertir la fecha, puesto que nuestro sistema operativo está en español la referencia cultural que está usando es “es”

Solución , usar DateTime.Parse con referencia cultural o DateTime.ParseExact (incluye el formato)

https://connect.microsoft.com/VisualStudio/feedback/details/729674/datetime-parse-fails-to-parse-correct-dates-or-accepts-incorrect-dates


Por si aun tienes curiosidad

Try
Dim fecha As DateTime
fecha = DateTime.Parse("20-JAN-09")
' falla ---> fecha = DateTime.Parse("20-MAR-09")
fecha = DateTime.ParseExact("20-MAR-09", "dd-MMM-yy", System.Globalization.CultureInfo.GetCultureInfo("en-US"), System.Globalization.DateTimeStyles.None)
fecha = DateTime.Parse("20-MAR-09", System.Globalization.CultureInfo.GetCultureInfo("en"), System.Globalization.DateTimeStyles.None)
fecha = DateTime.Parse("20-MAR-09", System.Globalization.CultureInfo.GetCultureInfo("en"))
fecha = DateTime.Parse("20-JAN-09", System.Globalization.CultureInfo.GetCultureInfo("es"))
' falla fecha = DateTime.Parse("20-MAR-09", System.Globalization.CultureInfo.GetCultureInfo("es"))
fecha = DateTime.ParseExact("20-MAR-09", "dd-MMM-yy", System.Globalization.CultureInfo.GetCultureInfo("es"), System.Globalization.DateTimeStyles.None)
fecha = DateTime.Parse("20-APR-09", System.Globalization.CultureInfo.GetCultureInfo("es"))
'falla --> fecha = DateTime.Parse("20-AVR.-09", System.Globalization.CultureInfo.GetCultureInfo("es"))
fecha = DateTime.Parse("20-APR-09", System.Globalization.CultureInfo.GetCultureInfo("fr"))
Catch ex As Exception

End Try

Me sorprendió que
fecha = DateTime.Parse("20-APR-09", System.Globalization.CultureInfo.GetCultureInfo("es"))

Funciona!!!!   El formato no es español, pero según la documentación

Este método intenta analizar s completamente para evitar que se produzca FormatException. Si es posible, omite los datos no reconocidos y rellena la información que falta acerca de mes, día y año con la hora actual. Si s contiene sólo una fecha y ninguna hora, este método supone que es medianoche (00:00). Se omiten los caracteres de espacio en blanco iniciales, centrales o finales que pueda haber en s. La fecha y la hora pueden ir entre corchetes con un par de caracteres NUMBER SIGN iniciales y finales ('#', U+0023) y pueden terminar con uno o más caracteres NULL (U+0000).”


Para evitar el FormatException, termina usando la InvariantCulture (que está en inglés) y por eso funciona

viernes, 11 de enero de 2013

sys.syscolumns o sys.columns parece lo mismo pero no lo es

Hoy he tenido un problema con   sys.syscolumns, la primera vez que lo vi pensaba que era sys.columns (parecido pero no es lo mismo)

La documentación del msdn deja mucho que desear para el sys.syscolumns
xtype - tinyint - Physical storage type from sys.types.
type - tinyint - Physical storage type from sys.types

Con esa explicación parece que debería tener el mismo valor , pero no es cierto en la columna type del sys.syscolumns hay valores como 0 o 39 que no están en el sys.types, en realidad esta en el sys.systypes (otra vez parece lo mismo pero no lo és)

Después de dar unas vueltas encontré las diferencias y cual tenia que usar

Catalog View es lo que se debería usar

En sys.syscolumns (Transact-SQL)
Tenia la siguiente nota :
"This SQL Server 2000 system table is included as a view for backward compatibility. We recommend that you use the current SQL Server system views instead. To find the equivalent system view or views, see Mapping SQL Server 2000 System Tables to SQL Server 2005 System Views. This feature will be removed in a future version of Microsoft SQL Server. Avoid using this feature in new development work, and plan to modify applications that currently use this feature."

MSDN equivalencias

Ejemplos para obtener información del catalogo

viernes, 4 de enero de 2013

Documentar si o si

Hoy hemos tenido una charla sobre el xml que se genera cuando compilamos, resulta que aun mucha gente no sabe que esto genera la documentación. Casi nunca documentamos, porque no vemos ningún fruto a los comentarios.

Para el que no sepa que es la documentación del código y para que vale, lee esto: MSDN

Depende de la versión del visual studio que tengas puede que tengas que instalar algún complemento para la documentación. La buena noticia es que las nuevas versiones del visual ya tiene la documentación para VB (antes solo estaba para C#)

Hasta el framework 3.5, prueba el NDoc, yo lo he usado y es fantástico. Super fácil de instalar y probar, con un montón de opciones para configurar.

También está disponible el Sandcastel (es válido para framework 4.0)
- Ayuda
- Instalarlo

Es útil, pero como todo si no lo has usado nunca vas a tardar un poco en verlo, para mi un pega es que es lento. Si no haces documentación empieza a escribirla según haces el código y prueba como sale la documentación para ver que sirve para algo y lo que puedes mejorar en tus comentarios.