2009-09-11 45 views
5

Estoy usando CrystalReportViewer y CrystalReportSource para cargar y mostrar un archivo .rpt en mi aplicación.Cambie dinámicamente la conexión de Crystal Report

La situación que tengo es la siguiente:

decimos que una persona crea un informe de cristal fuera de mi solicitud y establezca su fuente de datos a la base de datos A. Luego utilizo ese archivo rpt en mi solicitud, pero tengo que obligar a éste a una base de datos diferente (idéntica a la original en términos de estructura de tabla y nombres de columna, pero con una cadena de conexión diferente que utiliza un nombre de usuario y contraseña diferentes). ¿Cómo hago eso en C#?

Actualmente cargo el informe usando:

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

Respuesta

3

utilizo una función como la siguiente para asignar la información de conexión en tiempo de ejecución.

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

Usted debe ser capaz de simplemente crear un nuevo objeto ConnectionInfo con la información necesaria y pasarlo a la función junto con el documento de informe. Espero que esto ayude.

+0

Hi Dusty ... gracias por la ayuda. Implementé las líneas de código anteriores y también hice algunas investigaciones por mi cuenta. por lo hereis mi código: AssignConnectionInfo (documento ReportDocument, ConnectionInfo crConnection) private void { foreach (CrystalDecisions.CrystalReports.Engine.Table crTable en document.Database.Tables) { – suzi167

+1

Este es el código - lo siento golpeó el poste demasiado temprano antes: AssignConnection private void (documento ReportDocument, ConnectionInfo crConnection) { foreach (CrystalDecisions.CrystalReports.Engine.Table crTable en document.Database.Tables) { CrystalDecisions.Shared.TableLogOnInfo TableLogOnInfo = crTable.LogOnInfo; tableLogonInfo.ConnectionInfo = crConnection; crTable.ApplyLogOnInfo (tableLogonInfo); CrystalReportViewer1.ReportSource = document; CrystalReportViewer1.RefreshReport(); } crConnection tiene los valores correctos cuando se pasa. – suzi167

+0

El formateo no es muy bueno, por cierto ... ¿hay alguna forma de formatear mi mensaje (como etiquetas o algo así) – suzi167

2

Código 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

Usted puede utilizar el código siguiente para aplicar algunos elementos de conexión para un informe en tiempo de ejecución.

Utilice este método justo después de cargar el archivo de informe de informe y pase los detalles de conexión requeridos al método, obtendrá los datos del informe de los detalles de conexión pasados.

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