2011-02-01 4 views
5

Этот вопрос для людей, имеющих опыт работы с CR.Кристальный отчет и проблема с подключением

У меня проблема с установочным соединением с Crystal report. Я получил отчет от моего клиента. Структура базы данных такая же на его и на моем сервере. Но имя сервера и db отличается. Он использует команду «Command» для создания отчета (добавить команду в поля Database-> Database Expert ...). Эта команда имеет некоторую функцию для возврата данных. Я пытаюсь запустить этот отчет на своем компьютере, и у меня есть проблема, когда я пытаюсь выполнить TestConnectivity(). Этот метод возвращает false. Я пытаюсь отлаживать, и я обнаружил, что после применения внутреннего объекта ApplyLogOnInfo() RasTable имеет старое ConnectionInfo.

Я использую следующий код для установленного соединения:

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

Так что мои вопросы:

  • Как я могу установить правильное соединение с Command?
  • Почему я не могу изменить соединение? (если отчет был создан на другом сервере).

ответ

2

Я столкнулся с той же проблемой несколько лет назад, а затем написал класс. Вот класс:

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

Только в том случае, если вы хотите знать, как использовать читайте здесь: http://midnightprogrammer.net/post/Passing-Parameters-and-Loading-Crystal-Report-Programmatically.aspx

0

Вам просто нужно добавить ref слова в методе определения

ниже

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); 
      } 
     } 
    } 
} 
Смежные вопросы