2009-07-17 4 views
0

Я использую простой элемент управления FileUpload, чтобы выбрать файл excel, получить данные и сохранить их в db. Когда я пытаюсь загрузить после выбора файла, я получаю эту ошибку. Но путь к файлу правильный.Ошибка в пути к файлу в asp.net

"FilePath" не является допустимым путем. Сделайте уверен, что путь к файлу пишется правильно и что вы подключены к серверу, на котором файл проживает

используемый код:

<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

Вы должны с помощью String.Format вместо Заменить на строке подключения. – James

+0

Также вам не нужен .ToString() в конце вашего свойства AppSettings ["OleDbConnection"], он всегда возвращает значение в виде строки – James

+0

. Каково значение OleDbConnection? – mattruma

ответ

1

Изменение линии

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

Вы PROB есть относительный путь, вам нужен физический путь с Server.MapPath

Попробуйте следующий код, Ive успешно выполнить запрос на листе в используя вашу идею выше.

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

Я получаю, что «Filepath» не является допустимым виртуальным путем, когда я это делаю. Одна вещь, которую я забыл упомянуть, заключается в том, что исходный код отлично работает, когда я запускаю VS на моей локальной машине, но не тогда, когда я публикую на сервере и получаю доступ к нему на другой машине. – blntechie

+0

Попробуйте рутину, это работает? –

1

Пробовали ли вы оберточной путь к файлу с Server.MapPath (имя_файла)?

Как выглядит ваша строка соединения, если вы ответите. Запишите ее на страницу?

0

Вы упускаете "с помощью" блоков:

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

Это не причина, по которой он получает ошибку, так это то, что он ... однако, это улучшение кода, поскольку он даже не выпускает используемые объекты! – James

Смежные вопросы