2009-09-11 10 views
5

Używam CrystalReportViewer i CrystalReportSource, aby załadować i wyświetlić plik .rpt w mojej aplikacji.Dynamiczna zmiana połączenia Crystal Report

Sytuacja mam to:

Say osoba stworzyła raport kryształowego poza mojej aplikacji i ustawić jego źródła danych do bazy danych A. Następnie używać tego pliku .RPT w mojej aplikacji, ale trzeba go wiązać do innej bazy danych (identycznej z oryginalną pod względem struktury tabeli i nazw kolumn, ale z innym ciągiem połączenia przy użyciu innej nazwy użytkownika i hasła). Jak to zrobić w C#?

Obecnie załadować raportu przy użyciu:

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

Odpowiedz

3

używam funkcji jak następuje przypisanie informacje o połączeniu w czasie wykonywania.

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

Powinieneś być w stanie po prostu utworzyć nowy obiekt ConnectionInfo niezbędnej informacji i przekazać go do funkcji wraz z dokumentem raportu. Mam nadzieję że to pomoże.

+0

Cześć Dusty ... dzięki za pomoc. Zaimplementowałem linie kodu powyżej i sam też przeprowadziłem pewne badania. tak hereis mój kod: private void AssignConnectionInfo (dokument ReportDocument, ConnectionInfo crConnection) { foreach (CrystalDecisions.CrystalReports.Engine.Table crTable w document.Database.Tables) { – suzi167

+1

Oto kod - Niestety trafił w słupek zbyt wcześnie przed: private void AssignConnection (dokument ReportDocument, ConnectionInfo crConnection) { foreach (CrystalDecisions.CrystalReports.Engine.Table crTable w document.Database.Tables) { CrystalDecisions.Shared.TableLogOnInfo tableLogonInfo = crTable.LogOnInfo; tableLogonInfo.ConnectionInfo = crConnection; crTable.ApplyLogOnInfo (tableLogonInfo); CrystalReportViewer1.ReportSource = dokument; CrystalReportViewer1.RefreshReport(); } crConnection ma prawidłowe wartości po wyłączeniu. – suzi167

+0

Formatowanie nie jest zbyt dobre przy okazji ... czy istnieje sposób na sformatowanie mojej wiadomości (jak tagi lub coś w tym stylu)? – suzi167

2

VB Kod:

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

można użyć poniższy kod, żeby zastosować pewne szczegóły połączenia dla raportu w czasie wykonywania.

Proszę użyć tej metody zaraz po załadowaniu pliku raportu rpt, i przekazać wymagane szczegóły połączenia do metody, pobierze dane raportu z przekazanych danych połączenia.

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; 
        } 
       } 
      } 
     } 
    } 
Powiązane problemy