我正在编写一个相当轻量级的.Net应用程序,它可以查询Access数据库并根据结果集生成Crystal Report。
数据集填充方法是小慢,但可管理。
问题是当我加载水晶报告时。如果传递给Crystal的数据集相当大, at all ,则需要永久加载,用户放弃。
这是设置报告数据集的代码:
report.SetDataSource(largeDataSet);
largeDataSet有两个表。我把它们配对到绝对必要的列。
最终发生的是
reportViewer.Show();
命令触发,但ReportViewer需要几分钟才能实际显示报告。
我不知所措。
感谢您的帮助和反馈。
答案 0 :(得分:1)
我建议您尝试使用性能分析器应用。 ANTS Performance Profiler是一个很好的。
http://www.red-gate.com/products/ants_performance_profiler/index.htm
答案 1 :(得分:0)
我最终使用DataView进行排序(有效地设置非聚集索引),然后仅筛选出我需要的每个表中的行,然后设置新数据集并使用dataView.ToTable( )填充新数据集的方法。
这为Crystal Reports设置了一个成本较低的事务。以前的6-10分钟报告现在在一分钟内加载。
private DataSet FilterData()
{
DataSet filteredData = new DataSet("FilteredData");
DataView viewAccount = new DataView(global65DataSet.SET_ACCOUNT_TABLE);
viewAccount.Sort = "Number ASC";
viewAccount.RowFilter = " Number >= '" + beginningAcct+"' AND Number <= '" + endAcct + "' ";
DataView viewTrans = new DataView(global65DataSet.SET_TRANSACTION_TABLE);
viewTrans.Sort = "Transaction_ID ASC, DateTime ASC";
viewTrans.RowFilter = " DateTime >= '" + beginningDate.ToShortDateString() + "' AND DateTime <= '" +
endDate.ToShortDateString() + "'";
filteredData.Tables.Add(viewAccount.ToTable());
filteredData.Tables.Add(viewTrans.ToTable());
filteredData.Tables[0].TableName = "SET_ACCOUNT_TABLE";
filteredData.Tables[1].TableName = "SET_TRANSACTION_TABLE";
return filteredData;
}
可能有更好的,更多的OO方式来做到这一点,但这有效:)