gpt4 book ai didi

c# - Crystal Reports ReportDocument 泄漏句柄

转载 作者:太空宇宙 更新时间:2023-11-03 13:22:26 27 4
gpt4 key购买 nike

我已经编写了一个小型 C# 应用程序来使用 Crystal Reports 将报告保存为 pdf。我遇到的问题是,随着我保存更多的报告,我的应用程序的句柄不断增加,并且我可以看到正在建立新的数据库连接并在保存每个报告后保持打开状态。最终,应用程序从 Crystal 收到一个异常,提示“数据库登录错误”,或者我收到一个 C++ 运行时错误,提示“R6025:纯虚函数调用”。

我正在使用 process explorer 查看应用程序句柄, 根据 this technique .我正在使用 MS SQL Server 的事件监视器检查数据库连接。每个保存的报告都会导致另外 100 个打开“信号量”和“事件”句柄以及 2 个数据库连接。

我相信我通过调用 Close() 然后调用 Dispose() 正确处理了报告,如前所述 here .网络上的其他建议包括手动关闭数据库连接 (Crystal reports - close the database connection) 和调用 GC.Collect(),但在我的案例中都没有用。

一些环境细节

  • Visual Studio 2012
  • 面向 .NET 4.5.1 运行时的 C# 控制台应用程序
  • 数据库:MSSQL Server 2012
  • .NET Framework 4.0 的 Crystal Reports,版本 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();
}
}
}

谁能告诉我我做错了什么?

最佳答案

您使用的是 SAP B1 的 Crystal 报表吗?如果是这样,则这是在 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

关于c# - Crystal Reports ReportDocument 泄漏句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23692551/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com