2010-08-29 8 views
6

estoy creando una utilidad para importar datos de Excel a la base de datos Oracle,Necesito una solución para los tipos de datos en Excel que conjetura problema

que tienen una plantilla fija para el archivo de Excel,

Ahora, cuando Estoy tratando de importar los datos por el proveedor de Jet y las herramientas de conexión ADO.Net - Ole, encontré el siguiente problema: hay algunas columnas que no se han importado porque hay tipos de datos mixtos en sus columnas [cadena y número],

Busqué este problema en Internet encontré que el motivo es guessing data types from Excel

El código de carga:

connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0};Extended Properties=Excel 8.0;"); 
string columns = "P_ID, FULL_NAME_AR, job_no, GENDER, BIRTH_DATE, RELIGION, MARITAL_STATUS, NAT_ID, JOB_Name, FIRST_HIRE_DATE, HIRE_DATE, CONTRACT_TYPE, GRADE_CODE, QUALIFICATION"; 
string sheetName = "[Emps$]"; 
OleDbCommand command = new OleDbCommand(string.Format("select {0} from {1} where p_id is not null", columns, sheetName), connection); 

connection.Open(); 
dr = command.ExecuteReader(); 
DataTable table = new DataTable(); 
table.Load(dr); 

¿Qué debo hacer para decirle a Excel Dejar de adivinar y dame los datos como texto?

si no lo hay, ¿me pueden ayudar con alguna solución alternativa?

Gracias de antemano

+0

¿Cómo está importando los registros de excel a Oracle? código por favor? donde falla? – shahkalpesh

+0

¿No puede simplemente configurar toda la columna como texto en Excel? – Rup

+0

@ shahkalpesh: No arroja ninguna excepción, simplemente ignora los datos de texto porque adivina que el tipo de datos para la columna es el número de los primeros 8 registros y devuelve nulo para los valores no numéricos – Homam

Respuesta

7

he encontrado una solución mediante la adición de IMEX = 1 para la cadena de conexión, pero no hay un formato especial para ella que descriped en el siguiente link .

El parámetro IMEX es para columnas que usan valores alfabéticos y numéricos mixtos. El controlador de Excel normalmente escaneará las primeras filas para determinar qué tipo de datos usar para cada columna. Si se determina que una columna es numérica en función de un escaneo de las primeras filas, todas las filas con caracteres alfabéticos en esta columna se devolverán como nulas a . El parámetro IMEX (1 es el modo de entrada) fuerza el tipo de datos de la columna al texto para que los valores alfanuméricos se manejen correctamente.

Saludos

1

se puede trabajar desde el excel terminar? En este ejemplo se ejecute en Excel pondrá tyoes mezcladas de datos en una tabla de SQL Server:

Dim cn As New ADODB.Connection 

scn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _ 
& sFullName _ 
& ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";" 

cn.Open scn 

s = "SELECT Col1, Col2, Col3 INTO [ODBC;Description=TEST;DRIVER=SQL Server;" _ 
& "SERVER=Some\Instance;Trusted_Connection=Yes;" _ 
& "DATABASE=test].TableZ FROM [Sheet1$]" 
cn.Execute s 
+0

Gracias Remou, pero no es adecuado para mi caso, pero mi pregunta es, ¿por qué no puedo usar IMEX = 1 en ADO.Net? y ¿existe una propiedad de extensión similar que funcione con ADO.Net? – Homam

+1

¿Por qué no puedes usar IMEX = 1? Es solo parte de la cadena de conexión.En este http://www.pcreview.co.uk/forums/thread-1863969.php, Paul, MVP, sugiere que puedas. – Fionnuala

+0

@ Remou: Muchas gracias, funciona, era necesario (char) 34 en la cadena de conexión (desde el enlace que ha agregado). – Homam

1

esto no es completamente correcta! Aparentemente, Jet/ACE SIEMPRE asume un tipo de cadena si las primeras 8 filas están en blanco, independientemente de IMEX = 1, y siempre utiliza un tipo numérico si las primeras 8 filas son números (nuevamente, independientemente de IMEX = 1). Incluso cuando hice que las filas se leyeran a 0 en el registro, todavía tenía el mismo problema. Esta fue la única forma segura de hacerlo funcionar:

try 
{ 
    Console.Write(wsReader.GetDouble(j).ToString()); 
} 
catch //Lame unfixable bug 
{ 
    Console.Write(wsReader.GetString(j)); 
} 

+0

Todo depende de si ha alterado el registro o no, TypeGuessRows en particular http://msdn.microsoft.com/en-us/library/bb177610(v=office.12).aspx – Fionnuala

+0

intente con wsReader.GetValue (j) .ToString(), y luego si lo quiere como un doble, puede intentar analizarlo desde la cadena. – Jim

+0

El problema con esto, Jim, es que si sus primeros valores en la columna son números pero luego tiene valores como "CDF62738", esos valores se tomarán como NULL debido a un número no válido: / – tomasofen

Cuestiones relacionadas