2011-02-01 21 views
5

Esta pregunta para las personas que tienen experiencia con CR.Informe de Crystal y problema con la conexión

Tengo un problema con la conexión establecida al informe de Crystal. Recibí un informe de mi cliente. La estructura de la base de datos es la misma en su servidor y en él. Pero el nombre de servidor y db es diferente. Está usando "Comando" para crear un informe (comando Agregar en campos de la Base de Datos-> Experto en Base de Datos ...). Este comando tiene alguna función para devolver datos. Intento ejecutar este informe en mi computadora y tengo un problema cuando intento ejecutar TestConnectivity(). Este método devuelve falso. Intento depurar y encontré que después de aplicar el objeto interno ApplyLogOnInfo() RasTable tiene ConnectionInfo anterior.

estoy usando el siguiente código para la conexión serie:

  private void ApplyConnection(ReportDocument report, ConnectionInfo connectionInfo) 
    { 
     ApplyLogOnInfo(report, connectionInfo); 
     ApplyLogOnInfoForSubreports(report, connectionInfo); 
    } 

    private void ApplyLogOnInfo(ReportDocument reportDocument, ConnectionInfo connectionInfo) 
    { 
     foreach (Table table in reportDocument.Database.Tables) 
     { 
      table.LogOnInfo.ConnectionInfo.AllowCustomConnection = true; 
      TableLogOnInfo tableLogonInfo = table.LogOnInfo; 
      tableLogonInfo.ConnectionInfo = connectionInfo; 
      table.ApplyLogOnInfo(tableLogonInfo); 

      _log.InfoFormat("Table connection state: TableName = {0}, IsConnect = {1}", table.Name, table.TestConnectivity()); 
     } 
    } 

    private void ApplyLogOnInfoForSubreports(ReportDocument reportDocument, ConnectionInfo connectionInfo) 
    { 
     Sections sections = reportDocument.ReportDefinition.Sections; 
     foreach (Section section in sections) 
     { 
      ReportObjects reportObjects = section.ReportObjects; 
      foreach (ReportObject reportObject in reportObjects) 
      { 
       _log.InfoFormat("Type = {0}, Name = {1}",reportObject.Name, reportObject.Kind); 
       if (reportObject.Kind == ReportObjectKind.SubreportObject) 
       { 
        var subreportObject = (SubreportObject)reportObject; 
        ReportDocument subReportDocument = subreportObject.OpenSubreport(subreportObject.SubreportName); 
        ApplyLogOnInfo(subReportDocument, connectionInfo); 
       } 
      } 
     } 
    } 

Así que mis preguntas son:

  • ¿Cómo puedo configurar la conexión derecho a mandar?
  • ¿Por qué no puedo cambiar la conexión? (si el informe fue creado en otro servidor).

Respuesta

2

Solía ​​enfrentar el mismo problema hace unos años y luego escribí una clase. Aquí está la clase:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using CrystalDecisions.CrystalReports.Engine; 
using CrystalDecisions.Shared; 

namespace ReportExportDemo 
{ 
    class Reports 
{ 
    static TableLogOnInfo crTableLogonInfo; 
    static ConnectionInfo crConnectionInfo; 
    static Tables crTables; 
    static Database crDatabase; 

    public static void ReportLogin(ReportDocument crDoc, string Server, string Database, string UserID, string Password) 
    { 
     crConnectionInfo = new ConnectionInfo(); 
     crConnectionInfo.ServerName = Server; 
     crConnectionInfo.DatabaseName = Database; 
     crConnectionInfo.UserID = UserID; 
     crConnectionInfo.Password = Password; 
     crDatabase = crDoc.Database; crTables = crDatabase.Tables; 

     foreach (CrystalDecisions.CrystalReports.Engine.Table crTable in crTables) 
     { 
      crTableLogonInfo = crTable.LogOnInfo; 
      crTableLogonInfo.ConnectionInfo = crConnectionInfo; 
      crTable.ApplyLogOnInfo(crTableLogonInfo); 
     } 
    } 

    public static void ReportLogin(ReportDocument crDoc, string Server, string Database) 
    { 
     crConnectionInfo = new ConnectionInfo(); 
     crConnectionInfo.ServerName = Server; 
     crConnectionInfo.DatabaseName = Database; 
     crConnectionInfo.IntegratedSecurity = true; 
     crDatabase = crDoc.Database; crTables = crDatabase.Tables; 

     foreach (CrystalDecisions.CrystalReports.Engine.Table crTable in crTables) 
     { 
      crTableLogonInfo = crTable.LogOnInfo; 
      crTableLogonInfo.ConnectionInfo = crConnectionInfo; 
      crTable.ApplyLogOnInfo(crTableLogonInfo); 
     } 
    } 
} 
} 

Sólo en caso de que si quieres saber cómo utilizar leer más aquí: http://midnightprogrammer.net/post/Passing-Parameters-and-Loading-Crystal-Report-Programmatically.aspx

0

sólo tiene que añadir ref palabra en el método definiciones

como a continuación

private void ApplyConnection(ref ReportDocument report, ConnectionInfo connectionInfo) 
{ 
    ApplyLogOnInfo(report, connectionInfo); 
    ApplyLogOnInfoForSubreports(report, connectionInfo); 
} 

private void ApplyLogOnInfo(ref ReportDocument reportDocument, ConnectionInfo connectionInfo) 
{ 
    foreach (Table table in reportDocument.Database.Tables) 
    { 
     table.LogOnInfo.ConnectionInfo.AllowCustomConnection = true; 
     TableLogOnInfo tableLogonInfo = table.LogOnInfo; 
     tableLogonInfo.ConnectionInfo = connectionInfo; 
     table.ApplyLogOnInfo(tableLogonInfo); 

     _log.InfoFormat("Table connection state: TableName = {0}, IsConnect = {1}", table.Name, table.TestConnectivity()); 
    } 
} 

private void ApplyLogOnInfoForSubreports(ref ReportDocument reportDocument, ConnectionInfo connectionInfo) 
{ 
    Sections sections = reportDocument.ReportDefinition.Sections; 
    foreach (Section section in sections) 
    { 
     ReportObjects reportObjects = section.ReportObjects; 
     foreach (ReportObject reportObject in reportObjects) 
     { 
      _log.InfoFormat("Type = {0}, Name = {1}",reportObject.Name, reportObject.Kind); 
      if (reportObject.Kind == ReportObjectKind.SubreportObject) 
      { 
       var subreportObject = (SubreportObject)reportObject; 
       ReportDocument subReportDocument = subreportObject.OpenSubreport(subreportObject.SubreportName); 
       ApplyLogOnInfo(subReportDocument, connectionInfo); 
      } 
     } 
    } 
} 
Cuestiones relacionadas