动态更改Crystal Report的连接

6
我正在使用CrystalReportViewer和CrystalReportSource在我的应用程序中加载和显示.rpt文件。
我的情况是这样的:
假设一个人在我的应用程序之外创建了一个水晶报表,并将其数据源设置为数据库A。然后我在我的应用程序中使用该.rpt文件,但是我需要将其绑定到不同的数据库(与原始数据库在表结构和列名称方面相同,但使用不同的连接字符串和用户名和密码)。我该如何在C#中实现?
目前我使用以下方式加载报告:
this.CrystalReportSource1.ReportDocument.Load(reportsSubfolder + report.ReportFileName);
//it is here that I need to change the connection data of the report.
3个回答

4
我使用以下类似的函数在运行时分配连接信息。
private void SetDBLogonForReport(CrystalDecisions.Shared.ConnectionInfo connectionInfo, CrystalDecisions.CrystalReports.Engine.ReportDocument reportDocument)
{
    CrystalDecisions.CrystalReports.Engine.Tables tables = reportDocument.Database.Tables;

    foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
    {
        CrystalDecisions.Shared.TableLogOnInfo tableLogonInfo = table.LogOnInfo;

        tableLogonInfo.ConnectionInfo = connectionInfo;
        table.ApplyLogOnInfo(tableLogonInfo);
    }
}

您应该能够使用必要的信息简单地创建一个ConnectionInfo对象,并将其与报表文档一起传递到函数中。希望这能帮助到您。

嗨Dusty...感谢你的帮助。我实现了上面的代码行,并且我也进行了一些自己的研究。所以这是我的代码:private void AssignConnectionInfo(ReportDocument document, ConnectionInfo crConnection) { foreach (CrystalDecisions.CrystalReports.Engine.Table crTable in document.Database.Tables) { - suzi167
1
这是代码 - 抱歉在发布之前按下了按钮:private void AssignConnection(ReportDocument document, ConnectionInfo crConnection) { foreach (CrystalDecisions.CrystalReports.Engine.Table crTable in document.Database.Tables) { CrystalDecisions.Shared.TableLogOnInfo tableLogonInfo = crTable.LogOnInfo; tableLogonInfo.ConnectionInfo = crConnection; crTable.ApplyLogOnInfo(tableLogonInfo); CrystalReportViewer1.ReportSource = document; CrystalReportViewer1.RefreshReport(); } 当传递时,crConnection具有正确的值。 - suzi167
顺便说一下,格式不是很好...有没有什么方法可以格式化我的消息(比如标签或其他东西)? - suzi167
@suzi167 - 你可以使用这段代码编辑你的问题,以便按照你的意愿进行格式化。看起来AssignConnection函数本质上与我的答案中的函数相同,所以我认为它应该能够正常工作。你是否遇到了任何错误? - Dusty

2

VB 代码:

    Dim report = New ReportDocument

    Try
        'open report
        report.Load(filename, OpenReportMethod.OpenReportByTempCopy)

        'do this for each distinct database connection, rather than for table
        report.SetDatabaseLogon("user", "password", "server", "database")

    Catch ex As Exception
        'preserve the stack trace information
        Throw

    End Try

1
您可以使用以下代码在运行时应用某些连接详细信息来生成报表。
请在加载报表 rpt 文件后立即使用该方法,并将所需的连接详细信息传递给该方法,它将从传递的连接详细信息中获取报表数据。
    public static void CrystalReportLogOn(ReportDocument reportParameters,
                                          string serverName,
                                          string databaseName,
                                          string userName,
                                          string password)
    {
        TableLogOnInfo logOnInfo;
        ReportDocument subRd;
        Sections sects;
        ReportObjects ros;
        SubreportObject sro;

        if (reportParameters == null)
        {
            throw new ArgumentNullException("reportParameters");
        }

        try
        {
            foreach (CrystalDecisions.CrystalReports.Engine.Table t in reportParameters.Database.Tables)
            {
                logOnInfo = t.LogOnInfo;
                logOnInfo.ReportName = reportParameters.Name;
                logOnInfo.ConnectionInfo.ServerName = serverName;
                logOnInfo.ConnectionInfo.DatabaseName = databaseName;
                logOnInfo.ConnectionInfo.UserID = userName;
                logOnInfo.ConnectionInfo.Password = password;
                logOnInfo.TableName = t.Name;
                t.ApplyLogOnInfo(logOnInfo);
                t.Location = t.Name;
            }
        }
        catch
        {
            throw;
        }

        sects = reportParameters.ReportDefinition.Sections;
        foreach (Section sect in sects)
        {
            ros = sect.ReportObjects;
            foreach (ReportObject ro in ros)
            {
                if (ro.Kind == ReportObjectKind.SubreportObject)
                {
                    sro = (SubreportObject)ro;
                    subRd = sro.OpenSubreport(sro.SubreportName);
                    try
                    {
                        foreach (CrystalDecisions.CrystalReports.Engine.Table t in subRd.Database.Tables)
                        {
                            logOnInfo = t.LogOnInfo;
                            logOnInfo.ReportName = reportParameters.Name;
                            logOnInfo.ConnectionInfo.ServerName = serverName;
                            logOnInfo.ConnectionInfo.DatabaseName = databaseName;
                            logOnInfo.ConnectionInfo.UserID = userName;
                            logOnInfo.ConnectionInfo.Password = password;
                            logOnInfo.TableName = t.Name;
                            t.ApplyLogOnInfo(logOnInfo);
                        }
                    }
                    catch
                    {
                        throw;
                    }
                }
            }
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接