Crystal报告 - 关闭数据库连接

时间:2009-04-07 06:17:25

标签: c# sql-server crystal-reports report

这是在C#,Visual Studio 2008,VS2008附带的水晶报告

我有一个位于DLL中的水晶报表查看器表单。 DLL负责加载水晶报告(基于报告文件名),并在表单上显示报告。

当我完成水晶报告时,我在已加载的reportdocument对象上调用dispose。但是,数据库连接仍然存在。

Crystal似乎检测到有其他连接(从我的主应用程序)到同一个数据库,并保持其连接打开。关闭主应用程序数据库连接时,晶体连接将关闭。

有没有办法强制水晶关闭它的连接,而没有关闭主应用程序数据库连接?

5 个答案:

答案 0 :(得分:1)

如何通过设置身份验证在运行时创建自己的连接,或者让Crystal通过报告中存储的连接进行连接,如何连接到数据库?如果您以任何方式,形状或形式进行自己的连接,则必须手动关闭连接并在处理报告之前调用dispose。

这很可能是内存泄漏。我以前经历过这些。 Crystal Reports也存在内存泄漏问题,并且在他们的论坛上谈了很多但几年前我使用它时没有发布修复程序。我为其他选择抛弃了水晶。

答案 1 :(得分:0)

我对Crystal Reports不太熟悉,但由于包含IDisposable接口的继承链,有许多对象具有无用的Dispose()方法。如果您没有在服务器上看到任何性能问题,请不要担心。 GC准备就绪后,将负责客户端上的连接。你不应该试图比GC更聪明,你只会给自己带来更多麻烦。

并且,当它可用时,总是调用Dispose()(或使用{})。

答案 2 :(得分:0)

我遇到了同样的问题,除了我正在使用Sybase。不久之前,当我看到错误时,我发布了我编写的代码来处理连接(并且没有用)!我修正了错误,并且,交叉我的手指,现在它似乎工作。我打开了近100份报告,之前我无法打开10个。如果你试试这个,请告诉我它是否适合你。

在关闭包含Crystal Reports查看器的窗口之前,我正在做的就是:

var rd = (ReportDocument)crystalReportViewer1.ReportSource;
foreach (Table table in rd.Database.Tables)
   table.Dispose();
rd.Database.Dispose();
rd.Close();
rd.Dispose();
GC.Collect();

标记

答案 3 :(得分:0)

标记代码似乎在某种程度上缓解了这种情况,虽然它有点倒退,应该是这样的:

ReportDocument rd = (ReportDocument) viewer.ReportSource;
foreach (Table table in rd.Database.Tables)
    table.Dispose();
viewer.ReportSource = null;
rd.Database.Dispose();
rd.Close();
rd.Dispose();
rd = (ReportDocument) viewer.ReportSource;  
GC.Collect();

这并不能完全阻止泄漏,但肯定有帮助。

答案 4 :(得分:0)

connectDB();

ReportDocument cryRpt = new ReportDocument();
DataSet ds;
cmd = new SqlCommand("Select * from LeaveJO where IDno = '" + textBox1.Text + "'", conn);

da = new SqlDataAdapter(cmd);
ds = new DataSet();
da.Fill(ds, "LeaveJO");
            cryRpt.Load(@"JOleave.rpt");
            cryRpt.SetDataSource(ds);

            TableLogOnInfos crtableLogoninfos = new TableLogOnInfos();
TableLogOnInfo crtableLogoninfo = new TableLogOnInfo();
ConnectionInfo crConnectionInfo = new ConnectionInfo();
Tables CrTables;

crConnectionInfo.ServerName = cs.serverName;
crConnectionInfo.DatabaseName = cs.dbName;
crConnectionInfo.UserID = cs.userID;
crConnectionInfo.Password = cs.password;

CrTables = cryRpt.Database.Tables;
foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in CrTables)
{
    crtableLogoninfo = CrTable.LogOnInfo;
    crtableLogoninfo.ConnectionInfo = crConnectionInfo;
    CrTable.ApplyLogOnInfo(crtableLogoninfo);
}

cryRpt.Refresh();
//  cryRpt.PrintToPrinter(2, true, 1, 2);
crystalReportViewer1.ReportSource = cryRpt;
crystalReportViewer1.Visible = true;
cryRpt.Dispose();
conn.Dispose();