22 dic 2009

Modo Dios en Windows 7

Que tiempos aquellos del DOOM donde si nos frustrábamos mucho tratando de pasar un nivel o un boss podíamos activar el modo dios y nos volvíamos invulnerables, invencibles y entonces nos desquitábamos de todo lo sufrido.

Pues resulta y acontece que el recientemente lanzado Windows 7 tiene su modo dios. Consiste básicamente en un truquillo para activar un super panel de control donde existen muchas más opciones de configuración que en el panel normal.

¿Cúal es es el truco? Creamos una carpeta y la nombramos asi: "GodMode.{ED7BA470-8E54-465E-825C-99712043E01C}" sin las comillas. La carperta cambia de icono y queda nombrada como GodMode y como ya dijimos al explorarla lo que nos aparece es una gran gama de opciones. Yo la probé en un Windows 7 Profesional de 32 bits y la lista llega a alrededor de 275 opciones (La mayoría de accesibilidad).

La verdad no es la gran cosa, no nos volvemos ni invulnerables ni invencibles, pero es un truquillo interesante para apantallar a los amigos y ademas quién sabe sin en el futuro alguna de esas opciones extra nos saque de algún apuro.

8 dic 2009

Datos válidos se cargan nulos desde archivos Excel

En el post OLEDB Para cagar Archivos de Excel habíamos indicado una manera de cargar datos desde un archivo Excel utilizando OleDB explicando algunas de las propiedades del string de conexión según lo entendí en ese momento.

Ahora se nos presentó un problema menor con esta aproximación: Resulta que tenemos una columna cuyas celdas traen valores que normalmente son alfanuméricos, por lo que las celdas se formatean como texto; sin embargo en un punto del proceso se modificó manualmente un par de celdas de dicha columna con valores numéricos.

A la hora de realizar la consulta las dos celdas modificadas con valores numéricos son retornadas como nulas, específicamente con el valor DBNull de .Net. Estuvimos investigando y acontece que ése es el comportamiento normal, osea así es como funciona.

Cuando utilizamos este modo de cargar datos el tipo de la columna que prevalece es el de la mayoría de las celdas. Para clarificar, supongamos que tenemos una columna con 8 celdas:
  • Si 5 celdas son texto y 3 son numéricas. la consulta devolverá 5 valores (los texto) y 3 nulos.

  • Si 5 celdas son numericas y 3 son texto la consulta devolverá 5 valores (los numéricos) y 3 nulos.

  • Si 4 son numéricas y 4 son texto la consulta devolverá 4 valores (los numéricos) y 4 nulos.

Ahora bien, hay una forma de tratar con este problema: utilizando el valor IMEX de las Extented Properties del string de conexión. IMEX se utiliza precisamente para indicar que se importaran valores de tipos mixtos, pero lo hace convirtiendo todo a texto. Como lo mencionamos en el artículo mencionado anteriormente, utilizar el IMEX=1 "significa que se tomaran los valor tal y como se FORMATEAN en las celdas" por lo que hay que valorar y sopesar el uso de esta propiedad.

OleDbConnection cnnOle = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=C:Pruebas\test.xls;
Extended Properties=\"EXCEL 8.0;HDR=NO;IMEX=1\";");
cnnOle.Open();

En nuestra situación particular optamos por instruir al usuario del aplicativo que en caso de requerir modificar valores de la columna en cuestión se debe asegurar que las celdas se formatearan como texto, lo cual puede hacerse de manera simple: antes incluir cualquier dato utilizar una comilla simple. Ademas añadimos alertas durante la carga de que los valores nulos no se cargaran.

Algunos links que tratan sobre este asunto:

http://support.microsoft.com/kb/257819/
http://support.microsoft.com/kb/194124/EN-US/