我试图找到一种方法来简化从访问数据库导入数据到.Net应用程序

时间:2010-07-10 23:02:16

标签: c# .net crystal-reports

我正在编写一个相当轻量级的.Net应用程序,它可以查询Access数据库并根据结果集生成Crystal Report。

数据集填充方法是慢,但可管理。

问题是当我加载水晶报告时。如果传递给Crystal的数据集相当大, at all ,则需要永久加载,用户放弃。

这是设置报告数据集的代码:

report.SetDataSource(largeDataSet);

largeDataSet有两个表。我把它们配对到绝对必要的列。

最终发生的是

reportViewer.Show();

命令触发,但ReportViewer需要几分钟才能实际显示报告。

我不知所措。

感谢您的帮助和反馈。

2 个答案:

答案 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方式来做到这一点,但这有效:)