12 messaggi dal 04 gennaio 2007
Ieri al lavoro ci ho sbattuto la testa per un paio d'ore senza risultato
Vi descrivo le mie sfighe.
Devo leggere dei dati da un foglio excel e poi buttarli in una tabella di SQLServer e fin qui tutto bene:
faccio la mia connessione (Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & PathNomeFile & ";Extended Properties=""Excel ", faccio la mia query di estrazione dei dati, butto tutto in un recordset e inserisco riga x riga in tabella. FIN QUI NO PROBLEMA

QUANDO A UN CERTO PUNTO..

..mi accorgo che il mio file Excel ha 200 righe in più della mia tabella
La mia attenzione si ferma sulla colonna ISBN che contiene i codici del mio insieme di libri. La maggiorparte sono numerici mentre alcuni contengono una X in fondo.
Ebbene quelli con la X in fondo vengono visti da ASP come vuoti...

QUINDI COMINCIANO I MIEI DISPERATI TENTATIVI:

che sia un problema di formattazione dei dati del mio foglio excel? NO, anche se metto il formato testo nella colonna EXCEL ASP se ne fotte
sintesi delle mie ricerche su google: praticamente cosa fa OLEDB? Esamina tutta la colonna (o secondi alcuni i primi 8 campi) guardando che tipo di dati contiene: fa una media e stabilisce il tipo di dato (nel mio caso numerico per cui ignora i testuali!)


SOLUZIONI PROPOSTE:

usare hdr=yes;IMEX=1 nella stringa di connessione => Ad ASP pare non piaccia
cambiare la chiave di registro che indica su quanti valori calcolare la media => non funge
soluzione alternativa: se con una macro inserisco un carattere qualunque davanti a tutti i dati della mia famigerata colonna ASP riconosce tutti i dati come testo ho provato e funziona tutto! E allora posso fare anche lo stesso con ASP no? QUI si smorza definitivamente il mio entusiasmo: quando faccio CreateObject("Excel.Application") per andare a scrivere su Excel ASP mi dice che l'ActiveX non riesce a creare l'oggetto...


E QUI ALZO BANDIERA BIANCA...

QUALCUNO SA AIUTARMI?
Se non riesco entro oggi sono fottuto..
12 messaggi dal 04 gennaio 2007
DETTAGLI

La colonna ISBN così come tutte le colonne del mio foglio Excel sono settate in formato testo.
Il problema della colonna ISBN è che la maggior parte dei dati contenuti è di tipo numerico:

89999992278
67809090803
49999999999

mentre alcuni campi hanno invece valori di tipo "misto":

8999777777X

Ebbene Jet.OLE DB considera questi valori come nulli in quanto come ho scritto sopra (così riportano anche le specifiche di Microsoft) Jet.OLE DB vede che nella colonna la maggior parte dei dati è numerica e assume implicitamente questo come formato di lettura, non riconoscendo quindi dati del tipo riportato sopra (es:8999777777X).

La soluzione migliore sarebbe aggiungere hdr=yes;IMEX=1 nella stringa di connessione al foglio Excel (che a quanto pare serve proprio x disabilitare questo modo arbitrario con cui Jet.OLE DB interpreta la colonne miste) ma ho provato e a me non funziona.
Se a qualcuno per caso è riuscito a farlo funzionare lo prego di farmi sapere.

In alternativa si potrebbe aggirare il problema facendo con ASP un update della mia colonna ISBN in modo da avere tutti i campi in formato testo e poi eliminando il carattere aggiuntivo in fase di inserimento nel database. Ma purtroppo - porca zozza - sembra che l'istruzione chiave per accedere al foglio Excel ovvero CreateObject("Excel.Application") proprio non abbia voglia di funzionare in quanto mi viene segnalato come errore che l'ActiveX non riesce a creare l'oggetto. Se qualcuno sa dirmi una dritta per aggirare questo errore potrei risolvere con questo trucchetto.

Altrimenti sono bloccato.

Chiunque fosse in grado di darmi una mano o ancora meglio abbia già superato in passato questo tipo di problema godrà della mia stima e della mia riconoscenza in eterno!!!
218 messaggi dal 01 maggio 2003
www.lucasweb.it
Quando scrivi il valore ISBN prova a fare
cstr(valore_ISBN)

http://www.lucasweb.it
web design & development
12 messaggi dal 04 gennaio 2007
grazie luxor ma il problema è più complesso..
ho sollevato la questione anche in un altro forum e la conclusione a cui sono arrivato è che NON E' POSSIBILE CON ASP LEGGERE TUTTI I DATI DI UN FOGLIO EXCEL CON COLONNE CONTENENTI DATI DI TIPO MISTO..
Questa è la segnalazione di Microsoft:
Note If a column in your Excel spreadsheet contains both text and numbers, the Excel ODBC driver cannot correctly interpret which data type the column should be. Please make sure that all the cells in a column are of the same data type.

l'unica è utilizzare utilizzare un altro formato(txt,csv..) o comunque modificare le colonne dell'EXCEL con una macro prima della lettura..
6 messaggi dal 24 settembre 2005
Avevo il tuo stesso problema e leggendo i tuoi post ho scoperto che se metto l'opzione IMEX=1 a me funziona, tutti i campi che prima non leggevo adesso riesco a visualizzarli senza problemi anche se contengono testo o numeri.
Allego di seguito la stringa di connessione che ho usato secondo me l'errore è li:

strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
strConn = strConn + nomeFile + "; Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"";
12 messaggi dal 04 gennaio 2007
grazie gianluca ma il problema non si risolve
nel codice che hai postato non chiudi bene le stringhe
con questo codice, che poi dovrebbe essere l'equivalente del tuo:
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & nomeFile & ";Extended Properties=Excel 8.0;HDR=Yes;IMEX=1;"

viene generato questo errore ASP:
Microsoft JET Database Engine (0x80004005)
Impossibile trovare ISAM installabile.

non funziona neppure cambiare la chiave di registro
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\3.5\Engines\Excel\TypeGuessRows
così come suggerisce Microsoft:

SYMPTOMS
When connecting to an Excel Spreadsheet using the DAO OpenRecordset method, some values in an Excel column may be returned as Null when the underlying value is not a Null. This typically occurs when numeric and text datatypes are intermixed within the same Excel column.
CAUSE
This problem is caused by a limitation of the Excel ISAM driver in that once it determines the datatype of an Excel column, it will return a Null for any value that is not of the datatype the ISAM driver has defaulted to for that Excel column. The Excel ISAM driver determines the datatype of an Excel column by examining the actual values in the first few rows and then chooses a datatype that represents the majority of the values in its sampling.
RESOLUTION
There are two workarounds for this behavior:
1.Insure that the data in Excel is entered as text. Just reformatting the Excel column to Text will not accomplish this. You must re-enter the existing values after reformatting the Excel column. In Excel, you can use F5 to re-enter existing values in the selected cell.
2.You can add the option IMEX=1; to the Excel connect string in the OpenDatabase method.
NOTE: Setting IMEX=1 tells the driver to use Import mode. In this state, the registry setting ImportMixedTypes=Text will be noticed. This forces mixed data to be converted to text. For this to work reliably, you may also have to modify the registry setting, TypeGuessRows=8. The ISAM driver by default looks at the first eight rows and from that sampling determines the datatype. If this eight row sampling is all numeric, then setting IMEX=1 will not convert the default datatype to Text; it will remain numeric.

Modificato da Mauri77 il 01 febbraio 2007 19.55 -
6 messaggi dal 24 settembre 2005
Guarda che forse il problema è proprio nel ";" finale che non ci va, so che sembra una stupidagine ma ti prego di fare un tentativo, perchè l'errore che hai postato mi capita spesso quando sbaglio qualcosa nella sringa di connessione (non ha nulla a che vedere con ISAM o cose del genere) e comunque ti assicuro che nel mio caso dopo aver fatto la modifica che suggerivi la mia applicazione funziona e anche bene.

Per inciso l'esatta stringa di connessione (letteralmenet parlando) dovrebbe essere:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=nomeFile ; Extended Properties=<b>"Excel 8.0;HDR=Yes;IMEX=1"</b> 

quindi con la sezione extended Properties racchiusa tra "" dentro la stringa che dovrà essere passata all'oggetto che gestisce la connessione, infatti se noti nel mio post precedente avevo usato la sequenza di escape \" per gestire le virgolette nella stringa.

Prova e fammi sapere.
Modificato da gianluca.masini il 02 febbraio 2007 06.50 -
Modificato da gianluca.masini il 02 febbraio 2007 07.00 -
12 messaggi dal 04 gennaio 2007
grazie gianluca stasera faccio una prova senza ";" :
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & nomeFile & ";Extended Properties=Excel 8.0;HDR=Yes;IMEX=1"

e anche racchiudendo Extended Properties tra virgolette:
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & nomeFile & ";""Extended Properties=Excel 8.0;HDR=Yes;IMEX=1\"

è corretta la seconda

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.