2012-04-11 9 views

risposta

26

Da ConnectionStrings

"Se volete leggere le intestazioni delle colonne nel set di risultati (utilizzando HDR = NO anche se c'è un colpo di testa) e i dati della colonna è numerico, utilizzare IMEX = 1 per evitare incidente.

per utilizzare sempre IMEX = 1 è un modo più sicuro per recuperare i dati per le colonne di dati misti. .."

si prega di notare che il valore IMEX può essere molto importante quando si ha bisogno di scrivere di nuovo i dati in Excel. Una ricerca veloce su Internet su IMEX ha trovato numerosi articoli su problemi con vari valori IMEX

+0

Ok, quindi per quanto riguarda IMEX = 2? –

+1

Da qui: http://www.instantpages.ltd.uk/ADODB_WP.htm "MEX = 0 e IMEX = 2 risultato in ImportMixedTypes che viene ignorato e viene utilizzato il valore predefinito di 'MajorityType'." – kmp

+1

Capito. Viene utilizzato per le colonne con tipo di dati misti. Grazie per le risposte –

0

Quando si legge un file Excel in una tabella dati, la tabella dati legge i valori della colonna e dopo circa 8-10 record, sarà assegna il tipo di dati a una colonna. Per esempio, se i valori della colonna sono
11,0
22,0
33,0
44,0
55,0
66,0
77,0
88,0
99,0
abc
Quindi, la tabella dei dati non avrà il valore abc poiché alla colonna è stato assegnato il tipo di dati "Double". Per evitare questo, e per leggere i dati completi viene utilizzato IMEX = 1.
Si prega di commentare per ulteriori domande.

-5

Si prega di utilizzare una funzione generalizzata in un modulo ...

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

C'è un potenziale problema durante la lettura di file di Excel con un'OleDbConnection.

Se si utilizza

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

per una colonna come il seguente dove i primi 8 righe hanno 4 (o più) valori numerici, quindi il tipo è considerato essere numerici ei valori stringa vengono letti come nullo.

Si noti che l'intestazione non è utilizzata come intestazione qui (HDR = NO) quindi la riga "zipcode" è la prima riga. (Questi codici di avviamento postale sono dalla Svezia nel caso in cui non si riconosce il loro 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 

ma se vi dati assomiglia a questo, in cui solo 3 sono numerica dei primi 8 righe

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 

poi funziona, legge tutto, come stringhe.

Quindi il primo caso è un problema. Ma c'è una soluzione.

Diciamo che si utilizza

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

dove abbiamo cambiato IMEX a 1 e HDR a SÌ, allora sarà leggere i dati come stringhe in entrambi i casi di cui sopra. Ma diciamo abbiamo dati come questo

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

allora tutti i primi 8 righe di dati sono numerici e poi di nuovo errore, anche se abbiamo IMEX = 1.

È possibile risolvere questo problema nel modo seguente. Modificare la stringa di connessione a questa

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

Avviso che abbiamo tenuto IMEX = 1, ma cambiato di nuovo HDR su NO.

Ora la riga 1 non viene più trattata come un'intestazione e "zipcode" è letti come dati e poiché è chiaramente una stringa, tutte le righe vengono lette come stringhe (è così che IMEX = 1 funziona).

Ci sono un paio di inconvenienti con questo metodo. Entrambi possono essere risolti:

1) Non è possibile fare riferimento alla colonna in base al suo nome (codice postale) ma è necessario utilizzare ad esempio F7 a seconda di dove si trova la colonna.

È possibile risolvere questo problema capire dove si trova la colonna codice postale (può essere fatto a livello di codice) e modificare il testo SQL di conseguenza cambia "codice postale" per esempio "F7".

2) Il valore "zipcode" verrà visualizzato nei dati.

Questo può essere risolto avendo F7 <> 'codice postale' nel tuo clausola WHERE. Uno potrebbe pensare che ciò contrasterebbe il fatto che abbiamo incluso lo zip (essendo una stringa) per assicurarci che tutte le righe siano trattate come stringhe. Dopo averlo provato, si scopre però che la clausola where che esclude "zipcode" non ha un effetto antagonista .

+0

Grazie per la spiegazione dettagliata. Mi sto occupando di questo problema con il codice postale degli Stati Uniti. I codici postali a 5 cifre vengono considerati come valori doppi e i codici di avviamento postale 5-4 vengono ignorati poiché sono stringhe :( – Shiva

Problemi correlati