2009-07-17 6 views
0

J'utilise un simple contrôle FileUpload pour sélectionner un fichier Excel, récupérer les données et les stocker dans db. Lorsque j'essaie de télécharger après avoir sélectionné le fichier, je reçois cette erreur. Mais le chemin du fichier est correct.Erreur de chemin de fichier non valide dans asp.net

"FilePath" n'est pas un chemin d'accès valide. Assurez vous que le nom de chemin d'accès est correctement et que vous êtes connecté au serveur sur lequel le fichier réside

Code utilisé est:

<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

Vous devez à l'aide String.Format au lieu de remplacer sur votre chaîne de connexion. – James

+0

De même, vous n'avez pas besoin du .ToString() à la fin de votre propriété AppSettings ["OleDbConnection"], elle renvoie toujours la valeur sous forme de chaîne – James

+0

À quoi ressemble la valeur de OleDbConnection? – mattruma

Répondre

1

Modifiez la ligne

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

Vous prob avoir le chemin relatif, vous avez besoin du chemin physique avec Server.MapPath

Essayez le code suivant, Ive exécuté avec succès une requête sur une feuille dans un environnement hébergé en utilisant votre idée ci-dessus.

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

Je reçois un "Filepath" n'est pas un chemin virtuel valide quand je fais cela. Une chose que j'ai oublié de mentionner est, le code original fonctionne bien quand je cours de VS dans ma machine locale mais pas quand je publie au serveur et accède à l'autre machine. – blntechie

+0

Essayez la routine cela fonctionne-t-il? –

1

Avez-vous essayé envelopper le chemin du fichier avec un Server.MapPath (FileName)?

À quoi ressemble votre chaîne de connexion si vous répondez.Écrivez-vous sur la page?

0

Vous êtes absent "en utilisant" blocs:

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

Ce n'est pas la raison pour laquelle il reçoit l'erreur, il est ... cependant, c'est une amélioration sur le code car il ne libère même pas les objets utilisés! – James

Questions connexes