2016-07-22 53 views
0

zu generieren Ich verwende EPPLUS, um Excel-Datei aus Datenbanktabelle zu generieren, aber die erstellte Datei bleibt schreibgeschützt, bis der vollständige SSIS-Prozess beendet wird. Ich brauche die Datei nach dem später im Prozess zu bewegen, und dies wird immer mit der folgenden Meldung in SSIS fehlschlagen:Dateien sind immer schreibgeschützt, wenn EPPLUS verwendet wird, um Excel-Datei aus Datenbanktabelle

[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.".

Wenn ich versuche, die Datei in Excel zu öffnen ich die „File in Use“ bekam

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.

Hier ist mein Code:

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; 
     } 
    } 

ich verwende EPPLUS 4.0.5, die ich plane, auf 4,1 zu aktualisieren, aber der Release-Naht dieses Problem nicht zu decken.

EDIT: Ich habe auf 4.1 aktualisiert, aber das Problem besteht noch.

+0

https://epplus.codeplex.com/workitem/14919 – Kilren

+0

Blick auf Ihren Code und die epplus Dokumentation sieht aus wie Sie tun, was Sie brauchen, aber vielleicht epplus hat einen Fehler, dass der using {} -Block die Objekte nicht ordnungsgemäß entsorgt. Sie könnten versuchen, sich selbst zu entsorgen und zu beseitigen .... – Matt

+0

Ich habe offensichtlich schon versucht, alle Einwegartikel manuell zu entsorgen(). Ich werde versuchen, das Objekt auf Null setzen und sehen ... – Kilren

Antwort

0

Ich habe das Problem gefunden. Es gibt einen Fehler in der EPPLUS-Bibliothek, der keinen Strom vor der Entsorgung des Pakets entsorgt. Ich habe einen Antrag auf eine Pull-Anfrage unter Gabel DebugPackageDispose

eingereicht Hoffentlich wird dies bald integriert werden.