2010-08-29 10 views
6

Sto creando un programma di utilità per importare dati da Excel a database Oracle,Ho bisogno di un workaround per i tipi di Excel Guessing dati problema

Ho un modello fisso per il file di Excel,

Ora, quando Sto cercando di importare i dati dal provider Jet e dagli strumenti di connessione ADO.Net - Ole, ho trovato il seguente problema: ci sono alcune colonne che non sono state importate perché ci sono tipi di dati misti nelle loro colonne [stringa e numero],

Ho cercato questo problema su Internet, ho trovato il motivo è guessing data types from Excel

Il codice di carico:

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); 

Cosa devo fare per dire a Excel Smettere di fare supposizioni e mi danno i dati come testo?

se non c'è, puoi aiutarmi con soluzioni alternative?

Grazie in anticipo

+0

Come stai importando i record da Excel a Oracle? codice per favore? dove fallisce? – shahkalpesh

+0

Non puoi semplicemente impostare l'intera colonna come testo in Excel? – Rup

+0

@ shahkalpesh: Non lancia alcuna eccezione, ignora semplicemente i dati di testo perché indovina il tipo di dati per la colonna è il numero dei primi 8 record e restituisce null per i valori non numerici – Homam

risposta

7

ho trovato una soluzione con l'aggiunta di IMEX = 1 per la stringa di connessione, ma c'è un formato speciale per esso, che descriped nel seguente link .

Il parametro IMEX è per le colonne che utilizzano valori misti numerici e alfa. In genere, il driver Excel esegue la scansione delle prime diverse righe per determinare il tipo di dati da utilizzare per ciascuna colonna. Se una colonna è determinata per essere numerica in base a una scansione delle prime diverse righe, quindi tutte le righe con caratteri alfa in questa colonna saranno restituite come Null. Il parametro IMEX (1 è la modalità di input) impone il tipo di dati della colonna al testo in modo che i valori alfanumerici vengano gestiti correttamente.

saluti

1

Si può lavorare dall'estremità fine? Questo esempio eseguito in Excel metterà tyoes di dati misti in una tabella di 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

Grazie Rem, ma non è adatto per il mio caso, ma la mia domanda è, perché non posso usare IMEX = 1 in ADO.Net? e c'è una proprietà di estensione simile funziona con ADO.Net? – Homam

+1

Perché non puoi usare IMEX = 1? È solo una parte della stringa di connessione.In questo http://www.pcreview.co.uk/forums/thread-1863969.php, Paul, MVP, ti suggerisce di farlo. – Fionnuala

+0

@ Remou: Grazie mille, funziona, era necessario (char) 34 nella stringa di connessione (dal link che hai aggiunto). – Homam

1

questo non è completamente giusto! Apparentemente, Jet/ACE SEMPRE assume un tipo di stringa se le prime 8 righe sono vuote, indipendentemente da IMEX = 1, e usa sempre un tipo numerico se le prime 8 righe sono numeri (di nuovo, indipendentemente da IMEX = 1). Anche quando ho fatto leggere le righe a 0 nel registro, avevo ancora lo stesso problema. Questo era l'unico modo sicuro per farlo funzionare:

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

+0

Tutto dipende dalla manomissione del registro o meno, TypeGuessRows in particolare http://msdn.microsoft.com/en-us/library/bb177610(v=office.12).aspx – Fionnuala

+0

provare a utilizzare wsReader.GetValue (j) .ToString(), e quindi se lo vuoi come doppio puoi provare ad analizzarlo dalla stringa. – Jim

+0

Il problema con questo, Jim, è che se i tuoi primi valori nella colonna sono numeri ma successivamente hai valori come "CDF62738", quei valori saranno presi come NULL per il numero non valido: / – tomasofen