2012-04-11 29 views

Respuesta

26

De ConnectionStrings

"Si quieres leer los encabezados de columna en el conjunto de resultados (utilizando HDR = NO a pesar de que hay una cabecera) y los datos de la columna es numérico, utilice IMEX = 1 para evitar accidente.

utilizar siempre IMEX = 1 es una forma más segura para recuperar datos de columnas de datos mixtos. .."

Tenga en cuenta que el valor IMEX puede ser muy importante cuando se necesita volver a escribir los datos al Excel. Una búsqueda rápida en Internet en IMEX encontró numerosos artículos sobre problemas con varios valores IMEX

+0

Ok, ¿y qué hay de IMEX = 2? –

+1

Desde aquí: http://www.instantpages.ltd.uk/ADODB_WP.htm "MEX = 0 e IMEX = 2 dan como resultado ImportMixedTypes que se ignora y se utiliza el valor predeterminado de 'MajorityType'." – kmp

+1

Lo tengo. Se usa para columnas con tipos de datos mixtos. Gracias por las respuestas –

0

Cuando está leyendo un archivo de Excel en una tabla de datos, la tabla de datos lee los valores de la columna y después de unos 8-10 registros, asignar tipo de datos a una columna. Por ejemplo, si los valores de las columnas son
11,0
22,0
33,0
44,0
55,0
66,0
77,0
88,0
99,0
abc
Por lo tanto, la tabla de datos no tendrá el valor abc ya que a la columna se le ha asignado el tipo de datos "Doble". Para evitar esto, y para leer datos completos, se usa IMEX = 1.
Por favor, comente para más consultas.

-5

favor utilice una función generalizada en un módulo ...

Public Function DeleteBlankRowsfromDataset(ByRef Dtset As DataSet) As Boolean 
    Try 
     Dtset.Tables(0).AsEnumerable().Where(Function(row) row.ItemArray.All(Function(field) field Is Nothing Or field Is DBNull.Value Or field.Equals(""))).ToList().ForEach(Sub(row) row.Delete()) 
     Dtset.Tables(0).AcceptChanges() 
     DeleteBlankRowsfromDataset = True 
    Catch ex As Exception 
     MsgBox("Deleting Blank Records in Dataset Failed") 
     DeleteBlankRowsfromDataset = False 
    End Try 

End Function 
10

Hay un problema potencial cuando la lectura de archivos de Excel con una OleDbConnection.

Si utiliza

"Extended Properties='Excel 8.0;HDR=NO;IMEX=3;'" 

para una columna como la siguiente, donde los primeros 8 filas tienen 4 (o más) valores numéricos, entonces el tipo se considera que es numérico y los valores de cadena se leen como nulo.

Observe que el encabezado no se usa aquí como encabezado (HDR = NO), por lo que la fila "zipcode" es la primera fila. (Estos códigos postales son de Suecia en caso de que no reconoce su formato.)

1) zipcode 
2) 125 45 
3) 115 50 
4) 18735 
5) 11335 
6) 13940 
7) 181 55 
8) 11759 
9) 176 74 
10) 137 38 

pero si los datos se parece a esto, donde sólo 3 son numéricas de las primeras 8 filas

1) zipcode 
2) 125 45 
3) 115 50 
4) 18735 
5) 11335 
6) 139 40 <-- This one changed so that it is a string 
7) 181 55 
8) 11759 
9) 176 74 
10) 137 38 

luego funciona, lo lee todo, como cadenas.

El primer caso es un problema. pero hay una solución.

Digamos que utiliza

"Extended Properties='Excel 8.0;HDR=YES;IMEX=1;'" 

donde hemos cambiado IMEX a 1 y HDR en SÍ, entonces leerá los datos como cadenas en los dos casos anteriores. Pero supongamos que tenemos datos como estos

1) zipcode 
2) 12545 
3) 11550 
4) 18735 
5) 11335 
6) 13940 
7) 18155 
8) 11759 
9) 17674 
10) 137 38 

luego, de las primeras 8 filas de datos son numéricos y luego otra vez falla, aunque tenemos IMEX = 1.

Puede resolver este problema de la siguiente manera. Cambie la cadena de conexión a este

"Extended Properties='Excel 8.0;HDR=NO;IMEX=1;'" 

Observe que mantuvimos IMEX = 1 pero cambiamos el HDR a NO.

Ahora la fila 1 ya no se trata como un encabezado y "zipcode" es leído como datos y dado que es claramente una cadena, todas las filas se leen como cadenas (así es como funciona IMEX = 1).

Hay un par de inconvenientes con este método. Ambas pueden resolverse:

1) No puede hacer referencia a la columna por su nombre (código postal) pero debe usar, por ejemplo, F7 dependiendo de dónde se encuentre la columna.

Puede resolver esto mediante averiguar dónde se encuentra la columna del código postal de (se puede hacer mediante programación) y cambiar el texto SQL en consecuencia cambiando "código postal" para, por ejemplo, "F7".

2) El valor "código postal" aparecerá en sus datos.

Esto se puede resolver teniendo F7 <> 'zipcode' en su cláusula where. Un podría pensar que esto contrarrestaría el hecho de que incluimos el código postal (que es una cadena) para asegurarnos de que todas las filas se tratan como cadenas. Después de haber probado esto, resulta que la cláusula where truco que excluye "código postal" no tiene un efecto de contrarrestar .

+0

Gracias por la explicación detallada. Estoy lidiando con este problema con el código postal de EE. UU. Los códigos postales de 5 dígitos se tratan como valores dobles, y se ignoran de 5 a 4 códigos postales, ya que son cadenas :( – Shiva

Cuestiones relacionadas