2009-09-11 79 views
5

我正在使用CrystalReportViewer和CrystalReportSource在我的应用程序中加载和显示.rpt文件。动态更改Crystal Report的连接

我的情况是这样的:

说一个人创造了一个水晶报表我的应用程序之外和数据源设置为数据库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

我用一个函数类似下面的连接信息,在运行时分配。

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对象提供必要的信息,并把它传递到功能与报表文档一起。希望这可以帮助。

+0

嗨Dusty ...感谢您的帮助。我实现了上面的代码行,我也自己做了一些研究。所以hereis我的代码: 私人无效AssignConnectionInfo(的ReportDocument文件,ConnectionInfo crConnection) { 的foreach(CrystalDecisions.CrystalReports.Engine.Table crTable在document.Database.Tables) { – suzi167 2009-09-14 19:48:47

+1

这里是代码 - 遗憾击中门柱太早之前: 私人无效AssignConnection(的ReportDocument文件,ConnectionInfo crConnection) { 的foreach(CrystalDecisions.CrystalReports.Engine.Table crTable在document.Database.Tables) { CrystalDecisions.Shared.TableLogOnInfo tableLogonInfo = crTable.LogOnInfo; tableLogonInfo.ConnectionInfo = crConnection; crTable.ApplyLogOnInfo(tableLogonInfo); CrystalReportViewer1.ReportSource = document; CrystalReportViewer1.RefreshReport(); } crConnection在经过时具有正确的值。 – suzi167 2009-09-14 19:52:54

+0

格式化不是很好的方式...有没有一种方法来格式化我的消息(如标签或其他东西) – suzi167 2009-09-14 19:53:57

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