将DB日志信息应用于每个Crystal Reports部分时,应用程序运行缓慢

目前,我使用以下方法将连接信息分配给所有报告部分。 但由于我在报告中有很多部分,报告将在几乎10秒后显示。 这看起来真的很慢。 是否有其他方法可以在客户端安装一次登录信息到每个CR一次。

JFYI :所有CR都使用相同的登录凭据连接到同一个数据库。 先感谢您。

readDiamondBillReport = new RealDiamondBill(); crConnectionInfo.ServerName = db.Connection.DataSource; crConnectionInfo.DatabaseName = db.Connection.Database; crConnectionInfo.UserID = "client"; crConnectionInfo.Password = "client"; crConnectionInfo.IntegratedSecurity = false; CrTables = readDiamondBillReport.Database.Tables; foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in CrTables) { crtableLogoninfo = CrTable.LogOnInfo; crtableLogoninfo.ConnectionInfo = crConnectionInfo; CrTable.ApplyLogOnInfo(crtableLogoninfo); } Sections crSections2 = readDiamondBillReport.ReportDefinition.Sections; // loop through all the sections to find all the report objects foreach (Section crSection in crSections2) { ReportObjects crReportObjects = crSection.ReportObjects; //loop through all the report objects in there to find all subreports foreach (ReportObject crReportObject in crReportObjects) { if (crReportObject.Kind == ReportObjectKind.SubreportObject) { SubreportObject crSubreportObject = (SubreportObject)crReportObject; //open the subreport object and logon as for the general report ReportDocument crSubreportDocument = crSubreportObject.OpenSubreport(crSubreportObject.SubreportName); Tables SubCrTables = crSubreportDocument.Database.Tables; foreach (CrystalDecisions.CrystalReports.Engine.Table SubCrTable in SubCrTables) { crtableLogoninfo = SubCrTable.LogOnInfo; crtableLogoninfo.ConnectionInfo = crConnectionInfo; SubCrTable.ApplyLogOnInfo(crtableLogoninfo); } } } } readDiamondBillReport.Refresh(); 

我终于发现,既没有应用登录信息就是问题,也没有刷新报告。 但这是我用来在水晶报告中设置水印的大图片对象。

我有10个报告使用此图像作为水印。 我删除了水印图像,现在解决了以下问题:

  1. 项目构建非常快。 以前需要大约1分钟才能完成,现在已经大幅减少到8-10秒。

  2. 对项目的任何更改,尤其是对报表的更改都会更快地保存。

  3. 在一两次构建之后,我曾经得到“没有足够的存储空间来完成此操作” 。 我不得不重新启动VS并为每个构建交叉我的手指。

  4. Crystal Reports在CrystalReportViewer上显示得更快,而且objrpt.PrintToPrinter工作速度提高了500倍。

我希望这些观点能够帮助其他程序员。

虽然您已经回答了自己的问题,但我将指出可以与Crystal Reports一起使用的替代方法。 通常,人们使用“拉”方法,在Crystal方法中设置连接,并根据报表中嵌入的查询“拉取”数据集。

但是,也可以使用“推”方法。 在此方案中,您只需将Crystal Report数据源绑定到XSD架构,并在Crystal Report上设置数据集。 在.NET中,您可以轻松地从数据集生成XSD,因此这种方法很简单。 因此,您可以将任何子报表绑定到您希望从传递的数据集中的特定表。

这里的优点是数据可以来自任何DBMS(数据库不可知),并且可以在传递到报告之前根据需要进行操作(实现自定义安全性,连接等)。

需要注意的是,对于具有大量数据作为.NET数据集的报表,您不会实现此方法可能会占用大量内存。

但是,由于您的性能问题与图像有关,因此这种方法无济于事。

每个报告都有一个子报告集合。

您可以将登录信息应用于每个子报表的表,而不是在每个部分中搜索子报表。

这是一些代码

 private void showrep(string repName) { rd = new ReportDocument(); rd.Load(pth+"\\"+repName); LogInInfo(); crv.ReportSource = rd; // crv is the reportviewer crv.Show(); } private void LogInInfo() { MyApp.Properties.Settings s = new MyApp.Properties.Settings(); TableLogOnInfo linfo = new TableLogOnInfo(); linfo.ConnectionInfo.DatabaseName = s.dbname; linfo.ConnectionInfo.UserID = s.usr; linfo.ConnectionInfo.Password = s.pw; linfo.ConnectionInfo.ServerName = s.svr; foreach (Table t in rd.Database.Tables) { t.ApplyLogOnInfo(linfo); } foreach (ReportDocument sr in rd.Subreports) { foreach (Table t in sr.Database.Tables ) { t.ApplyLogOnInfo(linfo); } } } 

希望能帮助到你。