2014-10-07 90 views
2

我在將Crystal報表導出爲pdf流時遇到了訪問問題。下面是一個運行在後臺任務的代碼在ASP.net MVC的Web應用程序:Crystal Reports - 進程無法訪問該文件,因爲它正在被另一個進程使用

using (var memoryStream = new MemoryStream()) 
using (var stream = reportDoc.ExportToStream(ExportFormatType.PortableDocFormat)) 
{ 
     stream.CopyTo(memoryStream); 
     data = memoryStream.ToArray(); 
} 

以下是異常的堆棧跟蹤:

System.Runtime.InteropServices.COMException (0x80004005): The process cannot access the file because it is being used by another process. 

    at CrystalDecisions.ReportAppServer.Controllers.ReportSourceClass.Export(ExportOptions pExportOptions, RequestContext pRequestContext) 
    at CrystalDecisions.ReportSource.EromReportSourceBase.ExportToStream(ExportRequestContext reqContext) 
    at CrystalDecisions.CrystalReports.Engine.FormatEngine.ExportToStream(ExportRequestContext reqContext) 
    at CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToStream(ExportOptions options) 
    at CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToStream(ExportFormatType formatType) 

如何解決這個問題?

+0

該錯誤不言自明。我會開始查看正在使用該文件的內容,或者打開該文件。 – aMazing 2014-10-07 01:04:48

回答

0

您的數據庫已打開,在您的項目中,轉到數據庫視圖,單擊數據庫,單擊刷新,然後單擊關閉連接。在此之後,您應該可以運行此代碼。

2

主要問題是你的水晶doc的記憶。因此,在每次導出後,您必須清理對象,清除緩存和GAC。

http://www.brianstevenson.com/blog/solution-the-process-cannot-access-the-file-filename-because-it-is-being-used-by-another-process

首先檢查上面的鏈接,我搜索和查找一個思緒之中,如下(click here to know more)

像往常一樣偶爾出現的錯誤,很難說。而99%的時間,SP不會解決問題。你不說的一件事是你如何從這個錯誤中恢復過來?重新啓動應用程序?重啓?

我會先查看%temp%文件夾,看看是否有孤立的CR臨時文件。如果有的話,你需要考慮爲什麼這些會成爲孤兒。

查看事件查看器。任何錯誤?警告?

確保在完成這些操作後使用.Close和.Dispose報告對象。

如果您使用的是數據集,請執行相同操作。

這是否發生高負載時間?如果是這樣,您可能需要調查Crystal Reports的許可和性能限制。

+1

上面的鏈接已損壞,但是[互聯網存檔版](https://web.archive.org/web/20160302165006/http://www.brianstevenson.com/blog/solution-the-process-cannot-access-該文件的文件名,因爲它正在被另一個進程使用)基本上說,當你在一個'System.Net.Mail中附加一個PDF報告(例如使用'ReportDocument.ExportToDisk'生成的) 。MailMessage',不要忘記郵件消息也必須處理,所以它可以釋放PDF文件。 – natenho 2017-06-21 15:04:19

0

我們通過添加圍繞ExportToStream的重試來「修復」ASP.NET MVC應用程序中的問題。我們嘗試了所有其他建議,但都沒有成功。

using (var memoryStream = new MemoryStream()) 
using (var stream = RetryHelper.Retry(() => reportDoc.ExportToStream(ExportFormatType.PortableDocFormat))) 
{ 
    stream.CopyTo(memoryStream); 
    fileInfo.Data = memoryStream.ToArray(); 
} 

...其中重試()方法是...

public static T Retry<T>(Func<T> action) 
{ 
    bool success = false; 
    int count = 0; 
    T response = default(T); 
    while (!success) 
    { 
     try 
     { 
      count++; 
      response = action(); 
      success = true; 
     } 
     catch (Exception ex) 
     { 
      //only try 10 times with increasing sleeps 
      if (count >= 10) 
      { 
       throw; 
      } 
      string message = ex.Message; 
      int sleepTimeInMilliSeconds = 100 * count * count;//100ms, 400, 900, 1600 ...... 
      Log.Debug(string.Format("Failed. Attempt {0}. Error={1}. Sleeping for {2}ms", count, message, sleepTimeInMilliSeconds), ex); 
      Thread.Sleep(sleepTimeInMilliSeconds); 
     } 
    } 
    return response; 
} 

咆哮 - 我不是一個大風扇CR。我們正在從CR轉向基於phantomjs的pdf解決方案。

0

您是否使用reportDocument.Load方法打開報告文件。如果是這樣,嘗試使用OpenReportMethod.OpenReportByTempCopy選項,所以它看起來像這樣

reportDocument.Load(file, OpenReportMethod.OpenReportByTempCopy); 
相關問題