2014-01-09 1 views
1

У меня есть процедура, которая перебирает коллекцию первенствует и .csv файл и тянет данные обратно в DataTable для обработки:Убить Шлюзы на Excel или CSV-файл

public static DataTable Get(string path, bool IsFirstRowHeader) 
    { 
     var header = "No"; 
     var sql = string.Empty; 
     DataTable dataTable = null; 
     var pathOnly = string.Empty; 
     var fileName = string.Empty; 

     try 
     { 
      pathOnly = Path.GetDirectoryName(path); 
      fileName = Path.GetFileName(path); 

      sql = @"SELECT * FROM [" + fileName + "]"; 

      if (IsFirstRowHeader) { header = "Yes"; } 

      using (var connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1;';")) 
      { 
       using (var command = new OleDbCommand(sql, connection)) 
       { 
        using (var adapter = new OleDbDataAdapter(command)) 
        { 
         dataTable = new DataTable {Locale = CultureInfo.CurrentCulture}; 
         adapter.Fill(dataTable); 
        } 
       } 
      } 
     } 
     catch(Exception ex) 
     { 
      ErrorLog.Log(); 
     } 

     return dataTable; 
    } 

Однако, если пользователь просматривает этот I получите следующую ошибку:

The Microsoft Jet database engine cannot open the file 
'\\cjserver\IS_CalendarImport\Staging\12-03-13done'. It is already opened exclusively 
by another user, or you need permission to view its data. 

Есть ли способ (желательно в коде, C#) автоматически освободить или обойти замок?

+0

Excel всегда будет открывать файлы, запрещающие другим доступ к ним. – poke

ответ

2

Теоретически, прогуливаясь по внутренним функциям окна и т. Д. Да, можно убить замок - на самом деле unlocker utility делает именно это. Однако в общем случае это неразумно, так как программы не ожидают, что замки волшебным образом исчезнут из-за внешнего процесса.

Тестирование файла, чтобы узнать, можете ли вы его открыть, прежде чем пытаться использовать его, является хорошей стратегией (попробуйте открыть файл непосредственно в коде C#).

Если вы не можете открыть файл в C# код, вы можете следовать один следующие стратегии:

1) Просто пропустить файл - и, возможно, информация пользователя, администратора и т.д. пропущенного файла 2) Повторите попытку позже, вернитесь, чтобы пропустить убийство после слишком большого количества попыток без успеха 3) Когда я печатал, я видел, что DarrenMB уже предложил копировать файл - и вместо этого использовать копию.

1

Не знаете, как обойти замок с помощью Jet (возможно, это невозможно), но вы можете скопировать файл, когда он используется в большинстве случаев.

Таким простым способом является копирование файла в каталог temp и запрос данных к временному файлу.

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