2009-09-11 12 views
5

Ich verwende CrystalReportViewer und CrystalReportSource zum Laden und Anzeigen einer .rpt-Datei in meiner Anwendung.Dynamisch die Verbindung eines Crystal Reports-Berichts ändern

Die Situation, die ich habe, ist dies:

Sprich eine Person einen Crystal-Bericht außerhalb meiner Anwendung erstellt und legen Sie die Datenquelle Datenbank A. ich dann die RPT-Datei in meiner Anwendung verwenden, aber ich brauche es zu binden zu einer anderen Datenbank (identisch mit der ursprünglichen Datenbank in Bezug auf Tabellenstruktur und Spaltennamen, jedoch mit einer anderen Verbindungszeichenfolge, die einen anderen Benutzernamen und ein anderes Kennwort verwendet). Wie mache ich das in C#?

Zur Zeit lade ich den Bericht mit:

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

Antwort

3

Ich verwende eine Funktion wie die im Anschluss an die Verbindungsinformationen zur Laufzeit zuweisen.

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

sollten Sie in der Lage sein, einfach ein neues Objekt Connection mit den notwendigen Informationen zu erstellen und sie in die Funktion zusammen mit dem Bericht Dokument übergeben. Hoffe das hilft.

+0

Hallo Dusty ... danke für die Hilfe. Ich habe die oben genannten Codezeilen implementiert und auch selbst recherchiert. so meinen Code Hier ist,: private void AssignConnectionInfo (Report Dokument, Connection crConnection) { foreach (CrystalDecisions.CrystalReports.Engine.Table crTable in document.Database.Tables) { – suzi167

+1

Hier ist der Code - traf leider die Post zu früh vor: private void Assign (Report Dokument, Connection crConnection) { foreach (CrystalDecisions.CrystalReports.Engine.Table crTable in document.Database.Tables) { CrystalDecisions.Shared.TableLogOnInfo tableLogonInfo = crTable.LogOnInfo; tableLogonInfo.ConnectionInfo = crVerbindung; crTable.ApplyLogOnInfo (tableLogonInfo); CrystalReportViewer1.ReportSource = Dokument; CrystalReportViewer1.RefreshReport(); } crConnection hat die korrekten Werte für die Übertragung. – suzi167

+0

Die Formatierung ist übrigens nicht sehr gut ... gibt es eine Möglichkeit, meine Nachricht zu formatieren (wie Tags oder etwas) – suzi167

2

VB-Code:

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

können Sie den folgenden Code verwenden, um bestimmte Verbindungsdaten für einen Bericht zur Laufzeit gelten.

Bitte verwenden Sie diese Methode direkt nach dem Laden der Berichts-RPT-Datei und übergeben Sie die erforderlichen Verbindungsdetails an die Methode. Dadurch werden Berichtsdaten aus den übergebenen Verbindungsdetails abgerufen.

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