c# - conexion - ¿Qué es IMEX en la cadena de conexión OLEDB?
excel 8.0 hdr yes database (4)
string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=localhost;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=2"
Hola. ¿Cuál es el propósito de IMEX?
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 aproximadamente 8-10 registros, asignará el tipo de datos a una columna. Por ejemplo, si los valores de la columna son
11.0
22.0
33.0
44.0
55.0
66.0
77.0
88.0
99.0
a B C
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.
"Si quiere leer los encabezados de las columnas en el conjunto de resultados (usando HDR = NO aunque haya un encabezado) y los datos de la columna sean numéricos, use IMEX = 1 para evitar el bloqueo.
Usar siempre IMEX = 1 es una forma más segura de recuperar datos para columnas de datos mixtos. .. "
Tenga en cuenta que el valor de IMEX puede ser muy importante cuando necesita escribir datos en Excel. Una búsqueda rápida en Internet en IMEX encontró numerosos artículos sobre problemas con varios valores de IMEX
Existe un problema potencial al leer archivos de Excel con una OleDbConnection.
Si utiliza
"Extended Properties=''Excel 8.0;HDR=NO;IMEX=3;''"
para una columna como la siguiente, donde las primeras 8 filas tienen 4 (o más) valores numéricos, entonces el tipo se considera numérico y los valores de cadena se leen como nulos.
Observe que el encabezado no se usa como encabezado aquí (HDR = NO), por lo que la fila de "código postal" es la primera fila. (Estos códigos postales son de Suecia en caso de que no reconozca 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 ven así, donde solo 3 son numéricos 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
entonces funciona, lo lee todo, como cadenas.
Entonces el primer caso es un problema. pero hay una solución.
Digamos que usas
"Extended Properties=''Excel 8.0;HDR=YES;IMEX=1;''"
donde hemos cambiado IMEX a 1 y HDR a SÍ, entonces leeremos los datos como cadenas en los dos casos anteriores. Pero digamos que tenemos datos como este.
1) zipcode
2) 12545
3) 11550
4) 18735
5) 11335
6) 13940
7) 18155
8) 11759
9) 17674
10) 137 38
luego, todas las primeras 8 filas de datos son numéricas y luego vuelve a fallar, aunque tenemos IMEX = 1.
Puede resolver este problema de la siguiente manera. Cambiar la cadena de conexión a este
"Extended Properties=''Excel 8.0;HDR=NO;IMEX=1;''"
Tenga en cuenta que mantuvimos IMEX = 1 pero cambió HDR a NO.
Ahora la fila 1 ya no se trata como un encabezado y "zipcode" se lee 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. Ambos se pueden resolver:
1) No puede referirse a la columna por su nombre (código postal), pero necesita usar, por ejemplo, F7 dependiendo de la ubicación de la columna.
Puede resolver esto averiguando dónde se encuentra la columna de código postal (se puede hacer mediante programación) y cambiar el texto de SQL en consecuencia cambiando "zipcode" a, por ejemplo, "F7".
2) El valor "zipcode" aparecerá en sus datos.
Esto se puede resolver al tener F7 <> ''zipcode'' en su cláusula where. Uno 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 traten como cadenas. Después de haber probado esto, resulta que el truco de la cláusula where que excluye el "código postal" no tiene ese efecto de contrarrestar.
Por favor use 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