2014-05-16 60 views
2

我已經編寫了一個小型C#應用程序來使用Crystal Reports將報告保存爲pdf。我遇到的問題是,當我保存更多的報告時,我的應用程序的句柄不斷增加,並且我可以看到新的數據庫連接正在創建,並且在保存每個報告後保持打開狀態。最終,應用程序從Crystal發出異常說'數據庫登錄錯誤',或者我得到一個C++運行時錯誤,抱怨'R6025:純虛函數調用'。Crystal Reports ReportDocument泄漏句柄

我正在查看使用process explorer的應用程序句柄,按照this technique。我正在使用MS SQL Server的活動監視器檢查數據庫連接。每個保存的報告導致另外100個打開句柄來處理'信號量'和'事件'以及2個數據庫連接。

我相信我通過調用Close()然後Dispose(),正如here所述正確地處理報告。網絡上的其他建議包括手動關閉數據庫連接(Crystal reports - close the database connection)並調用GC.Collect(),但是沒有一個適用於我的情況。

一些環境細節

  • 的Visual Studio 2012
  • C#控制檯應用程序針對.NET 4.5.1運行
  • 數據庫:MSSQL Server 2012的
  • 水晶報表的.NET Framework 4.0,版本13.09 .1312
  • 使用SAP數據庫連接的Crystal Report文檔(這很重要 - 請參閱答案)

這裏表現出了同樣的問題一個示例應用程序:

using System; 
using CrystalDecisions.CrystalReports.Engine; 
using CrystalDecisions.Shared; 

namespace ExampleConsoleApp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      while (true) 
      { 
       SaveReport(); 
      } 
     } 

     static void SaveReport() 
     { 
      Console.WriteLine("loading report..."); 

      ReportDocument rpt = new ReportDocument(); 
      rpt.Load("test.rpt"); 

      rpt.SetDatabaseLogon("username", "password"); 
      foreach (IConnectionInfo info in rpt.DataSourceConnections) 
      { 
       info.IntegratedSecurity = false; 
       info.SetConnection("SQL", "our_database", "username", "password"); 
      } 
      rpt.ExportToDisk(ExportFormatType.PortableDocFormat, "test.pdf"); 

      WaitForKeypress("about to dispose report"); 

      // attempt to manually close tables/database links 
      // none of the following commented code has had any effect 

      // foreach (TableLink tl in rpt.Database.Links) 
      // { 
      //  tl.Dispose(); 
      // } 
      // rpt.Database.Links.Reset(); 
      // rpt.Database.Links.Dispose(); 

      // foreach (Table table in rpt.Database.Tables) 
      // { 
      //  table.Dispose(); 
      // } 
      // rpt.Database.Tables.Reset(); 
      // rpt.Database.Tables.Dispose(); 
      // rpt.DataSourceConnections.Clear(); 
      // rpt.Database.Dispose(); 

      rpt.Close(); 
      rpt.Dispose(); 

      // rpt = null; 
      // GC.Collect(); 

      WaitForKeypress("disposed"); 
     } 

     private static void WaitForKeypress(string msg = "press a key...") 
     { 
      Console.WriteLine(msg); 
      Console.ReadLine(); 
     } 
    } 
} 

有人能告訴我什麼,我做錯了什麼?

回答

1

您是否在使用SAP B1的水晶報表? 如果是這樣,這是在Windows Server上運行代碼並在Crystal報表中使用SAP B1數據庫連接類型時的問題。我在Windows Server 2012的SAP B1中使用Boyum Usability Pack時遇到了同樣的問題。在將Crystal報表中的連接類型更改爲OLE(ADO)後,它工作正常。我認爲SAP B1數據庫連接類型是有問題的,或者可能不是用於此目的。

在youtube上看到這個視頻,它解釋瞭如何將驅動程序設置爲OLE(ADO)。 http://youtu.be/j7kpj2tR3d4