2009-07-17 9 views
0

Ich benutze ein einfaches FileUpload-Steuerelement, um eine Excel-Datei auszuwählen, die Daten abzurufen und in db zu speichern. Wenn ich versuche, nach dem Auswählen der Datei hochzuladen, erhalte ich diesen Fehler. Aber der Dateipfad ist korrekt.Ungültiger Dateipfadfehler in asp.net

"FilePath" ist kein gültiger Pfad. Vergewissern Sie sich, dass der Pfadname richtig geschrieben ist und dass Sie mit dem Server verbunden sind, auf dem die Datei

-Code befindet verwendet wird:

<add key="OleDbConnection" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source= FilePath ;Extended Properties=&quot;Excel 8.0;HDR=Yes;IMEX=1&quot;"/> 

    string OleDbConnection = 
     ConfigurationManager.AppSettings["OleDbConnection"].Replace("FilePath", 
      fileUpload.PostedFile.FileName).Trim(); 

     Excel.ApplicationClass xlApp = new Excel.ApplicationClass(); 
     Excel.Workbooks xlWorkBooks = (Excel.Workbooks)xlApp.Workbooks; 
    Excel.Workbook wb = xlWorkBooks._Open(fileUpload.PostedFile.FileName, Type.Missing, false, Type.Missing, "", "", true, Excel.XlPlatform.xlWindows, "\t", true, false, Type.Missing, true); 

     string strSheetName = ((Excel.Worksheet)wb.Sheets[1]).Name.ToString(); 
     xlWorkBooks.Close(); 
     xlApp.Quit(); 

     oledbCommand = new OleDbCommand(); 
     oledbAdapter = new OleDbDataAdapter(); 

     DataSet dsExcellData = new DataSet(); 
     oledbConnection = new OleDbConnection(OleDbConnection); 
     oledbConnection.Open(); 

     oledbCommand.Connection = oledbConnection; 
     oledbCommand.CommandText = "Select * from [" + strSheetName + "$]"; 

     oledbAdapter.SelectCommand = oledbCommand; 
     oledbAdapter.Fill(dsExcellData); 

     return dsExcellData; 
+1

Sie sollten String.Format statt Ersetzen auf Ihre Verbindungszeichenfolge. – James

+0

Sie benötigen auch nicht die .ToString() am Ende Ihrer AppSettings ["OleDbConnection"] -Eigenschaft, es gibt immer Wert als Zeichenfolge – James

+0

Wie sieht der Wert von OleDbConnection aus? – mattruma

Antwort

1

Ändern Sie die Zeile zu

string OleDbConnection = ConfigurationManager.AppSettings["OleDbConnection"].ToString().Replace("FilePath", Server.MapPath(fileUpload.PostedFile.FileName)).Trim(); 

Sie prob den relativen Pfad haben, müssen Sie den physischen Pfad mit Server.MapPath

den folgenden Code Versuchen Sie, Ive erfolgreich eine Abfrage auf einem Blatt in einem Lauf Hosted Environment mit Ihrer Idee oben.

private OleDbConnectionStringBuilder BuildXLConnString(string DSource) 
{ 
    OleDbConnectionStringBuilder connBuild = new OleDbConnectionStringBuilder(); 
    connBuild.Provider = "Microsoft.Jet.OLEDB.4.0"; 
    connBuild.DataSource = DSource; 
    connBuild.Add("Extended Properties", "Excel 8.0;IMEX=1;HDR=Yes;"); 
    return connBuild; 
} 
+0

Ich bekomme einen "Dateipfad" ist kein gültiger virtueller Pfad, wenn ich dies tue. Eine Sache, die ich vergessen habe zu erwähnen, ist, dass der ursprüngliche Code gut funktioniert, wenn ich von VS auf meinem lokalen Rechner laufe, aber nicht, wenn ich auf dem Server publiziere und auf einen anderen Rechner zugreife. – blntechie

+0

Versuchen Sie die Routine funktioniert das? –

1

Haben Sie versucht, den Dateipfad Einwickeln mit einem Server.MapPath (Dateiname)?

Wie sieht Ihre Verbindungszeichenfolge aus, wenn Sie antworten.Sie auf die Seite schreiben?

0

Sie verpassen "mit" Blöcke:

var xlApp = new Excel.ApplicationClass(); 
var xlWorkBooks = (Excel.Workbooks) xlApp.Workbooks; 
Excel.Workbook wb = xlWorkBooks._Open(
    fileUpload.PostedFile.FileName, Type.Missing, false, 
    Type.Missing, "", "", true, Excel.XlPlatform.xlWindows, "\t", 
    true, false, Type.Missing, true); 

string strSheetName = 
    ((Excel.Worksheet) wb.Sheets[1]).Name.ToString(); 
xlWorkBooks.Close(); 
xlApp.Quit(); 

var dsExcellData = new DataSet(); 

var oleDbConnectionString = 
    ConfigurationManager.AppSettings["OleDbConnection"].Replace(
     "FilePath", fileUpload.PostedFile.FileName).Trim(); 
var commandText = "Select * from [" + strSheetName + "$]"; 
using (
    var oledbConnection = new OleDbConnection(oleDbConnectionString) 
    ) 
{ 
    oledbConnection.Open(); 
    using (var oledbCommand = new OleDbCommand()) 
    { 
     oledbCommand.Connection = oledbConnection; 
     oledbCommand.CommandText = commandText; 
     { 
      using (var oledbAdapter = new OleDbDataAdapter()) 
      { 
       oledbAdapter.SelectCommand = oledbCommand; 
       oledbAdapter.Fill(dsExcellData); 
       return dsExcellData; 
      } 
     } 
    } 
} 
+1

Das ist nicht der Grund, warum er den Fehler empfängt, ist er ... aber es ist eine Verbesserung des Codes, da er nicht einmal die benutzten Objekte freigibt! – James

Verwandte Themen