martes, 8 de diciembre de 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/

0 comentarios: