Errore importazione csv to database/gridview

martedì 17 gennaio 2012 - 14.27
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Windows Server 2003  |  Visual Studio Express  |  SQL Server 2000

matteoct Profilo | Junior Member

Salve, ho la necessità di importare i dati contenuti in un file *.csv al database, ovvero mostrarli a video tramite gridview.

Ho trovato numerose risorse in rete e, utilizzando Visual Web Developers 2010 Express, funziona tutto benissimo; inoltre sono riuscito ad adattare il codice reperito alle mie esigenze.
Il problema è sorto dopo la pubblicazione sul server di produzione, che si trova su una intranet, ed utilizza come sistema operativo W 2003 SP2 - SQL 2000.

Sostanzialmente il codice che ho reperito svolge le seguenti operazioni:
1.upload del file csv
2.lettura dei dati dal file caricato
3.creazione del datatable
4.inserimento dei dati caricati in memoria nel db

Quando effettuo ciò dalla rete aziendale invece, dopo aver eseguito l’upload del file mi viene segnalato l’errore:

“Column 'Nome' does not belong to table”
Dove ‘Nome’ dovrebbe essere la prima Colonna del datatable.
Il file viene correttamente scritto/caricato nella directory dell’applicazione.

Ho inserito quindi un gridview e, dopo la lettura dei dati dal file csv, lo popolo con il datatable.
Il gridview effettivamente contiene i dati prelevati dal file csv che ho selezionato, ma non le colonne, e mi viene mostrato a video in maniera disordinata; tra una parole e l’altra, che dovrebbero corrispondere ai nomi delle colonne, c’è la virgola, cioè come se il codice non intrerpretasse la virgola come delimitatore, cosa che invece non accade quando utilizzo Visual Web Developers 2010 Express, in quanto, oltre ad importare correttamente i dati nel Db, il gridview viene mostrato correttamente.


Ieri ho trovato anche il semplicissimo codice incluso nella cartella "esempio_2", che sostanzialmente carica un file csv. e popola un gridview; anche in questo caso con Visual Web Developers 2010 Express funziona benissimo e con il server di produzione no, cioè il gridview non viene caricato e restituisce questo errore:

Could not find a part of the path 'C:\Users\XXXXXXXX\Desktop\GridViewExport.csv'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\Users\XXXXXXXX\Desktop\GridViewExport.csv'.

Source Error:


Line 19: Private Function ReadToEnd(filePath As String) As Object
Line 20: Dim dtDataSource As New DataTable()
Line 21: Dim fileContent As String() = File.ReadAllLines(filePath)
Line 22: ' Dim fileContent As String() = File.ReadAllLines(Server.MapPath(""))
Line 23: If fileContent.Count() > 0 Then


Source File: C:\Documents and Settings\Administrator\Desktop\Scadenzario\rubrica\test.aspx.vb Line: 21

Il codice utilizzato e due immagini che riassumono l'errore nella creazione del gridview sono inclusi nel file allegato

Grazie



alexmed Profilo | Guru

Ciao
Dal codice sembra che tenti di leggere il file direttamente dalla posizione originale (ovvero il tuo hard disk).
Prova a copiarlo nel in una cartella del server .

Ciao

alexmed

matteoct Profilo | Junior Member

Ciao alexmed e grazie per la risposta.
Effettivamente, vedendo il secondo esempio, il file viene letto dal client, ma nel primo esempio invece, il file viene correttamente "caricato" nella cartella sul server, lo vedo fisicamente che viene scritto, ma poi il codice non viene eseguito correttamente; ciò è riscontrabile confrontando le due immagini incluse nel file .zip che ho allegato prima, in quanto si nota la differenza dei gridview che vengono generati. Nel caso in cui si verifica l'errore, il gridview viene creato con una sola colonna e i nomi sono separati dalla virgola, cosa che non dovrebbe accadere.

Ciao e ancora grazie

alexmed Profilo | Guru

Ciao
Solo una cosa prima di fare delle prove: hai provato a cambiare il separatore? Prova da "," a ";"

alexmed

matteoct Profilo | Junior Member

Si, già fatto; l'ho cambiato sia nel codice, sia nel file csv.

grazie

matteoct Profilo | Junior Member

Ho risolto il mistero;
l'errore era causato dalle differenti impostazioni internazionali tra i due SO utilizzati e il delimitatore predefinito nella chiave di registro del W 2003, utilizzato in azienda, è il ';' punto e virgola e non ',' la virgola.

Praticamente il delimitatore scritto nel codice che riporto sotto viene completamente ignorato e viene considerato solo il valore indicato nella chiave di registro; è bastato sostituirlo ed ha funzionato tutto (cioè nel codice potete inserire quello che volete, punto, virgola, punto e virgola, etc ma non verrà considerato):

strConnString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath(strPath) & _
";Extended Properties='TEXT;HDR=Yes;FMT=Delimited;Format=Delimited(,)'"

La chiave in questione è (come riportato qui: http://www.connectionstrings.com/textfile#p20):

The delimiter can be specified in the registry at the following location:<br/> HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Jet \ 4.0 \ Engines \ Text <br/> "Format" = "TabDelimited"<br/> or<br/> "Format" = "Delimited(;)"<br/>

La dritta giusta l'ho trovata qui: http://forum.aspitalia.com/forum/post/353671/File-CSV-OleDB.aspx

Grazie alexmed per l'interessamento
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5