问题描述
|
我们正在运行一个报告Web应用程序,该应用程序允许用户选择一些字段,并根据所选字段生成水晶报表。为最复杂的报告生成的sql将在不到5秒的时间内返回数据,但是运行该报告平均需要3分钟,有时会更长,从而导致超时。我们正在运行VS2010。这些报告基本上是开箱即用的,不需要进行任何实际的操作或计算,而只是以一种很好的格式显示数据。有什么我们可以尝试加快速度的方法,预加载虚拟报告以加载dll,是否可以使Crystal更快运行的一些技巧?
编辑:添加代码以显示数据绑定
protected void Page_Load(object sender,EventArgs e)
{
if (!Page.IsPostBack)
{
string strFile = Server.MapPath(@\"AwardStatus.rpt\");
CrystalReportSource1.Report.FileName = strFile;
DataTable main = Main();
CrystalReportSource1.ReportDocument.SetDataSource(main);
CrystalReportViewer1.HasCrystallogo = false;
CrystalReportSource1.ReportDocument.ExportToHttpResponse(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat,Response,false,\"pmperformance\");
}
}
private DataTable Main()
{
Guid guidOffice = Office;
CMS.Model.ReportsTableAdapters.ViewACTableAdapter rptAdapter = new CMS.Model.ReportsTableAdapters.ViewACTableAdapter();
Reports.ViewAwardedContractsDataTable main = new Reports.ViewAwardedContractsDataTable();
if (Office == new Guid())
{
IEnumerable<DaTarow> data = rptAdapter.GetData().Where(d => UserPermissions.HasAccesstoOrg(d.guidFromId,AuthenticatedUser.PersonID)).Select(d => d);
foreach (var row in data)
{
main.ImportRow(row);
}
}
else if (guidOffice != new Guid())
{
main = rptAdapter.GetDataByOffice(guidOffice);
}
else
{
main = new Reports.ViewACDataTable();
}
return main;
}
private Guid Office
{
get
{
string strOffice = Request.QueryString[\"Office\"];
Guid guidOffice = BaseControl.ParseGuid(strOffice);
if (!UserPermissions.HasAccesstoOrg(guidOffice,AuthenticatedUser.PersonID))
{
return Guid.Empty;
}
else
{
return guidOffice;
}
}
}
protected void CrystalReportSource1_DataBinding(object sender,EventArgs e)
{
//Todo
}
解决方法
这可能有点轻率,但可能考虑不使用Crystal Reports ...最近我们在使用它们时遇到了很多麻烦(内存错误为其中之一),我们已经转而使用其他选项,对此我们感到非常高兴...
,这是我要做的:
从您从用户那里获得字段选择的时间开始一直放置时钟,直到显示报告为止。查看处理时间在哪里增加。
当您查看时钟时,可能会出现各种情况:
如果Crystal Reports需要时间来填充报表,请检查您的填充方式。如果要将报表字段直接链接到数据表,CR可能会花一些时间查找数据。我建议使用动态列(Field1,Field2,.. FieldN)创建一个新表(t_rpt),并将您的报告模板指向该表。我不知道您是否已经在这样做。
如果您花时间查找数据本身,建议您创建表视图。即使占用了存储空间,也可以使查找快速,完成后就可以删除视图。
如果以上都不是,请告诉我们您的时钟显示什么。
,在加载大量数据方面,您将始终希望使用存储过程。
除此之外,您将在第一次加载Crystal DLL时看到报表运行延迟。是的,您可以如前所述预加载它们,这将对您有所帮助。