C# 动态更改Crystal报表的连接

C# 动态更改Crystal报表的连接,c#,crystal-reports,C#,Crystal Reports,我正在使用CrystalReportViewer和CrystalReportSource在我的应用程序中加载和显示.rpt文件 我的情况是: 假设有人在我的应用程序之外创建了一个crystal报表,并将其数据源设置为数据库a。然后我在应用程序中使用该.rpt文件,但我需要将其绑定到另一个数据库(在表结构和列名方面与原来的相同,但使用不同的用户名和密码使用不同的连接字符串) 目前,我使用以下方式加载报告: this.CrystalReportSource1.ReportDocument.Load(

我正在使用CrystalReportViewer和CrystalReportSource在我的应用程序中加载和显示.rpt文件

我的情况是:

假设有人在我的应用程序之外创建了一个crystal报表,并将其数据源设置为数据库a。然后我在应用程序中使用该.rpt文件,但我需要将其绑定到另一个数据库(在表结构和列名方面与原来的相同,但使用不同的用户名和密码使用不同的连接字符串)

目前,我使用以下方式加载报告:

this.CrystalReportSource1.ReportDocument.Load(reportsSubfolder + report.ReportFileName);
//it is here that I need to change the connection data of the report.

我使用如下函数在运行时分配连接信息

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对象,并将其与报表文档一起传递到函数中。希望这有帮助。

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

您可以使用以下代码在运行时为报表应用某些连接详细信息

请在加载报表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;
                    }
                }
            }
        }
    }

Hi Dusty…谢谢你的帮助。我实现了上面的代码行,我自己也做了一些研究。下面是我的代码:private void AssignConnectionInfo(ReportDocument文档,ConnectionInfo crConnection){foreach(CrystalDecisions.CrystalReports.Engine.Table crTable in document.Database.Tables){下面是代码-抱歉,之前发的文章太早了:private void AssignConnection(ReportDocument文档,ConnectionInfo crConnection){foreach(document.Database.Tables中的CrystalDecisions.CrystalReports.Engine.Table crTable){CrystalDecisions.Shared.TableLogOnInfo TableLogOnInfo=crTable.LogOnInfo;TableLogOnInfo.ConnectionInfo=crConnection;crTable.ApplyGonInfo(TableLogOnInfo);CrystalReportViewer1.ReportSource=document;CrystalReportViewer1.RefreshReport();}crConnection在传递时具有正确的值。顺便问一下,格式不是很好…有没有办法格式化我的消息(如标记或其他内容)@suzi167-您可以使用此代码编辑您的问题,这将允许您按照自己的意愿对其进行格式设置。看起来AssignConnection函数与我的答案中的函数基本相同,因此我假设这会起作用。在任何类型的情况下,您是否会收到错误?