3

目前我使用以下方法将连接信息分配给所有报告部分。但由于我在报告中有很多部分,报告会在将近 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();
4

3 回答 3

3

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

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

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

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

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

  4. Crystal Reports 在 CrystalReportViewer 上的显示速度更快,objrpt.PrintToPrinter运行速度也提高了 500 倍。

我希望这些观点对程序员同行有所帮助。

于 2012-04-17T15:06:17.910 回答
3

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

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

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

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

但是,由于您的性能问题与图像有关,因此这种方法没有帮助。

于 2012-04-20T00:59:05.110 回答
2

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

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

这是一些代码

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);
                }
            }
        }

希望能帮助到你。

于 2012-04-14T06:06:35.803 回答