我已經編寫了一個小型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();
}
}
}
有人能告訴我什麼,我做錯了什麼?