2012-06-11 2 views
0

Мы читаем xls-файл, который регулярно обновляется с внешних ссылок. У нас есть цикл, который читает тот же файл после некоторого интервала в 200 мс. После чтения файла за 1000+ времени мы получаем сообщение об ошибке«Не удалось найти Installable ISAM» C# Исключение после чтения xls-файла

«Механизм базы данных Microsoft Jet не может открыть файл». Он уже открыт исключительно другим пользователем или вам требуется разрешение на просмотр его данных ».

Строка соединения выглядит следующим образом:

Provider = Microsoft.Jet.OLEDB.4.0; источник данных = D: \ FeedFiles \ TESTING1.xls; Extended Properties = "Excel 8.0; HDR = YES ; IMEX = 1; Importmixedtypes = текст; typeguessrows = 0;»

И через какое-то время оно начинает давать «Не удалось найти Installable ISAM».

код следующим образом:

String xlsConnString = String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;Importmixedtypes=text;typeguessrows=0;""", feedFiles.FullName); 

OleDbDataAdapter dataAdapter = new OleDbDataAdapter(xlsQuery, xlsConnString); 
while (true) 
{ 
    try 
    { 
     //Exception handling if not able to read xls file. 
     DataSet dataSet = new DataSet(); 
     dataAdapter.Fill(dataSet); 
     String fileName = dirstr + "Temp-"; 
     System.IO.StreamWriter file = new System.IO.StreamWriter(fileName + ".tmp"); 

     file.WriteLine(dataSet.GetXml()); 
     file.Close(); 

     try 
     { 
      File.Replace(fileName + ".tmp", dirstr + "Temp-" + filecount.ToString() + ".xml", null); 
     } 
     catch (Exception ex) 
     { 
      try 
      { 
       File.Move(fileName + ".tmp", dirstr + "Temp-" + filecount.ToString() + ".xml"); 
      } 
      catch 
      { 
       Thread.Sleep(xlsThreadSleep); 
      } 
     } 

     filecount++; 
     if (filecount > maxFileCnt) 
     { 
      filecount = 0; 
     } 
     dataSet.Clear(); 
     dataSet = null; 

     Thread.Sleep(xlsThreadSleep); 
    } 
    catch (Exception ex) 
    { 
     txtlog.BeginInvoke(new DelegateForTxtLog(functionFortxtLog), "Exception occured > " + ex.Message); 
     feedFileIndex++; 

     if (feedFileIndex == feedFiles.Length) 
     { 
      feedFileIndex = 0; 
     } 
     dataAdapter.Dispose(); 
     dataAdapter = null; 

     Thread.Sleep(xlsThreadSleep * 20); 

     xlsConnString = String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;Importmixedtypes=text;typeguessrows=0;""", feedFiles[feedFileIndex].FullName); 
     txtlog.BeginInvoke(new DelegateForTxtLog(functionFortxtLog), "Trying connecting with connection string > " + xlsConnString); 

     dataAdapter = new OleDbDataAdapter(xlsQuery, xlsConnString); 
     txtlog.BeginInvoke(new DelegateForTxtLog(functionFortxtLog), "Now reading file > " + feedFiles[feedFileIndex].FullName); 
    } 
} 
+0

1. Этот код (без * txtlog * связанных строк) работает на моей машине всего 1000 раз. Таким образом, проблема может быть связана с данными внутри вашего xls-файла 2. Где возникает исключение? Какая строка? 3. Вы пытались добавить *; Mode = Share Exclusive; * в строку подключения? – itsho

ответ

1

Строка соединения не отформатирован должным образом. Попробуйте это:

String xlsConnString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source= 
      {0};Extended Properties=\"Excel 8.0;HDR=YES; 
      IMEX=1;Importmixedtypes=text;typeguessrows=0;\"", feedFiles.FullName); 
+0

Но я могу прочитать файл почти в 1000 раз с той же строкой соединения и получить выше ошибки при чтении рекурсивно. –

+0

Пробовал, но такую ​​же ошибку. Кроме того, еще один момент. Этот полный код написан внутри потока. –

+0

как вы это решили? У меня такая же проблема –

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

  • Нет связанных вопросов^_^