如何使用 C# 为晶体报表动态设置数据库名称

本文关键字:设置 动态 数据库 报表 何使用 | 更新日期: 2023-09-27 18:34:18

我有一个C#窗口应用程序,其中有许多水晶报告。我使用以下代码段调用并显示它们:

rptDDCollection rpt = new rptDDCollection();
            rpt.SetDatabaseLogon(Connect.sDatabaseUserName, DLL.Connect.sDatabasePassword, "", Connect.sCurrentDatabase);
            rpt.RecordSelectionFormula = "";
            frmReports frm = new frmReports();
            frm.crViewer1.DisplayGroupTree = false;
            frm.crViewer1.ReportSource = rpt;
            frm.crViewer1.SelectionFormula = rpt.RecordSelectionFormula;                
            frm.crViewer1.Show();
            frm.Show();

现在,问题是我有 2 个数据库要处理。使用一个数据库可以正常工作。我必须使用相同的报告,但经常需要查看来自其他数据库的数据。数据库引擎是 SQL 服务器。在网络上搜索和堆栈溢出时,我发现了通过代码动态设置数据库名称的建议。在这种情况下,应该怎么做才能实现我想要的?

如何使用 C# 为晶体报表动态设置数据库名称

我通过为报告中的表设置数据库名称来解决此问题。我在上面的实际代码中进行了一次更改。我创建了一个名为 ApplyLogonInfo 的方法,并将报告对象传递给它。在该方法中,我编写了用于动态设置报告表的数据库名称的代码。这是修改后的代码:

rptDDCollection rpt = new rptDDCollection();
        rpt.SetDatabaseLogon(Connect.sDatabaseUserName, DLL.Connect.sDatabasePassword, "", Connect.sCurrentDatabase);
        ApplyLogOnInfo(rpt);     
        rpt.RecordSelectionFormula = "";  
        frmReports frm = new frmReports();
        frm.crViewer1.DisplayGroupTree = false;
        frm.crViewer1.ReportSource = rpt;
        frm.crViewer1.SelectionFormula = rpt.RecordSelectionFormula;                
        frm.crViewer1.Show();
        frm.Show();

下面是新创建的方法:

public static void ApplyLogOnInfo(ReportClass rpt)
    {
        TableLogOnInfo info = new TableLogOnInfo();
        info.ConnectionInfo.DatabaseName = Connect.sCurrentDatabase;
        for (int i = 0; i < rpt.Database.Tables.Count; i++)
        {
            rpt.Database.Tables[i].ApplyLogOnInfo(info);
        }
    }

sCurrentDatabase 是当前已选择进行查看的数据库的名称。

这使我能够动态设置数据库名称,现在我可以处理 2 个(或一般多个)数据库,并查看我希望看到的任何数据库中的数据。