2011-02-01 26 views
5

Questa domanda alle persone che hanno esperienza con CR.Report Crystal e problemi con la connessione

Ho un problema con la connessione impostata al report Crystal. Ho ricevuto un rapporto dal mio cliente. La struttura del database è la stessa sul suo e sul mio server. Ma il nome di server e db è diverso. Sta usando "Comando" per creare report (comando Aggiungi nei campi Database-> Esperto database ...). Questo comando ha una funzione per la restituzione dei dati. Provo ad eseguire questo rapporto sul mio computer e ho un problema quando provo ad eseguire TestConnectivity(). Questo metodo restituisce false. Provo a eseguire il debug e ho scoperto che dopo aver applicato l'oggetto interno ApplyLogOnInfo() RasTable ha un vecchio ConnectionInfo.

Sto utilizzando il codice successivo per il collegamento set:

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

Quindi le mie domande sono:

  • Come posso impostare la connessione diritto di comandare?
  • Perché non riesco a cambiare la connessione? (se il report è stato creato su un altro server).

risposta

2

Ho affrontato lo stesso problema qualche anno fa e poi ho scritto un corso. Qui è la classe:

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

Solo nel caso, se volete sapere come utilizzare leggere di più qui: http://midnightprogrammer.net/post/Passing-Parameters-and-Loading-Crystal-Report-Programmatically.aspx

0

Hai solo bisogno di aggiungere ref parola nel metodo di definizioni

come di seguito

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