2016-07-22 13 views
0

Я использую EPPLUS для генерации файла Excel из таблицы базы данных, но созданный файл остается в режиме только для чтения, пока не прекратится полный процесс SSIS. мне нужно переместить файл после того, как в конце процесса, и это всегда будет терпеть неудачу со следующим сообщением в SSIS:Файлы всегда доступны только для чтения при использовании EPPLUS для генерации файла Excel из таблицы базы данных

[File System Task] Error: An error occurred with the following error message: "The process cannot access the file because it is being used by another process.".

При попытке открыть файл в Excel, я получил «Файл в использовании»

book1.xlsx is locked for editing by 'another user'. Open 'Read-Only' or click 'Notify' to open read-only and receive notification when the document is no longer in use. I hope you'll be able to help me.

Вот мой код:

public void Main() 
    { 
     try 
     { 
      String FilePath = Dts.Variables["$Package::DestinationFileName"].Value.ToString(); 
      String TableName = Dts.Variables["$Package::SourceTableName"].Value.ToString(); 
      String ConnStr = Dts.Variables["$Project::ConnStr_DataWarehouse"].Value.ToString(); 

      //SqlConnection Conn = (SqlConnection)(Dts.Connections["DW"].AcquireConnection(Dts.Transaction) as SqlConnection); 
      using (SqlConnection Conn = new SqlConnection(ConnStr)) 
      { 
       String Sql = "SELECT * FROM " + TableName; 
       if (File.Exists(FilePath)) 
       { 
        try { File.Delete(FilePath); } 
        catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); Dts.TaskResult = (int)ScriptResults.Failure; } 
       } 
       using (DataTable dt = new DataTable()) 
       { 
        using (SqlCommand cmd = new SqlCommand(Sql, Conn)) 
        { 
         Conn.Open(); 
         using (SqlDataAdapter da = new SqlDataAdapter(cmd)) 
         { 
          da.Fill(dt); 
          FileInfo newFile = new FileInfo(FilePath); 
          using (ExcelPackage p = new ExcelPackage(newFile)) 
          { 
           using (ExcelWorksheet ws = p.Workbook.Worksheets.Add("RejectetionReport")) 
           { 
            ws.Cells["A1"].LoadFromDataTable(dt, true); 
            p.Save(); 
           } 
          } 
         } 
         Conn.Close(); 
        } 
       } 
      } 

      Dts.TaskResult = (int)ScriptResults.Success; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message.ToString()); 
      Dts.TaskResult = (int)ScriptResults.Failure; 
     } 
    } 

Я использую EPPLUS 4.0.5, который я планирую обновить до 4.1, но и релиз к сведению не шов, чтобы покрыть эту проблему.

EDIT: Я обновил до 4.1, но проблема все еще существует.

+0

Это похоже на длинную проблему: https://epplus.codeplex.com/workitem/14919 – Kilren

+0

, глядя на ваш код, и документация epplus выглядит так, как будто вы делаете то, что вам нужно, но, возможно, epplus имеет ошибку, что использование {} блока неправильно удаляет объекты. Вы могли бы попытаться избавиться от себя и устранить использование .... – Matt

+0

Я, очевидно, уже попытался утилизировать() вручную из всех одноразовых объектов. Я постараюсь установить объект в null и увидеть ... – Kilren

ответ

0

Я нашел проблему. В библиотеке EPPLUS есть ошибка, которая не удаляет поток перед удалением пакета. Я отправил исправление запроса на тягу под fork DebugPackageDispose

Надеюсь, что это будет интегрировано в ближайшее время.