2009-09-11 12 views
5

Sto utilizzando CrystalReportViewer e CrystalReportSource per caricare e visualizzare un file .rpt nella mia applicazione.Modifica dinamica della connessione di un Crystal Report

La situazione che ho è questa:

che una persona ha creato un rapporto di cristallo al di fuori della mia applicazione e impostare il DataSource al database di A. allora io uso il file .rpt nella mia applicazione, ma ho bisogno di legarlo in un database diverso (identico a quello originale in termini di struttura della tabella e nomi di colonne ma con una stringa di connessione diversa che utilizza un nome utente e una password diversi). Come posso farlo in C#?

Attualmente mi caricare il report utilizzando:

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

risposta

3

Io uso una funzione come la seguente per assegnare le informazioni di connessione in fase di esecuzione.

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

Si dovrebbe essere in grado di creare semplicemente un nuovo oggetto ConnectionInfo con le informazioni necessarie e farlo passare nella funzione insieme al documento rapporto. Spero che questo ti aiuti.

+0

Ciao Dusty ... grazie per l'aiuto. Ho implementato le righe di codice sopra e ho anche fatto delle ricerche per conto mio. così hereis il mio codice: private void AssignConnectionInfo (documento ReportDocument, ConnectionInfo crConnection) { foreach (CrystalDecisions.CrystalReports.Engine.Table crTable in document.Database.Tables) { – suzi167

+1

Ecco il codice - mi dispiace, colpisce il palo troppo presto prima: AssignConnection private void (documento ReportDocument, 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 ha i valori corretti superati. – suzi167

+0

La formattazione non è molto buona tra l'altro ... c'è un modo per formattare il mio messaggio (come tag o qualcosa di simile) – suzi167

2

Codice 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

È possibile utilizzare il seguente codice di applicare alcuni dettagli di connessione per un report in fase di esecuzione.

Utilizzare questo metodo subito dopo aver caricato il file di report rpt e passare i dettagli di connessione richiesti al metodo, recupererà i dati del report dai dettagli di connessione passati.

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