2011-02-01 18 views
5

सीआर के साथ अनुभव करने वाले लोगों के लिए यह प्रश्न।क्रिस्टल रिपोर्ट और कनेक्शन के साथ समस्या

मुझे क्रिस्टल रिपोर्ट के सेट कनेक्शन के साथ समस्या है। मुझे अपने ग्राहक से रिपोर्ट मिली है। डेटाबेस की संरचना उसके और मेरे सर्वर पर समान है। लेकिन सर्वर और डीबी का नाम अलग है। वह रिपोर्ट बनाने के लिए "कमांड" का उपयोग कर रहा है (डेटाबेस फ़ील्ड में कमांड जोड़ें-> डेटाबेस विशेषज्ञ ...)। इस कमांड में डेटा लौटने के लिए कुछ फ़ंक्शन है। मैं इस रिपोर्ट को अपने कंप्यूटर पर चलाने की कोशिश करता हूं और जब मैं TestConnectivity() निष्पादित करने का प्रयास करता हूं तो मुझे कोई समस्या है। यह विधि गलत है। मैं डीबग करने का प्रयास करता हूं और मैंने पाया कि ApplyLogOnInfo() आंतरिक ऑब्जेक्ट को लागू करने के बाद RasTable में पुरानी कनेक्शन इंफो है।

मैं सेट कनेक्शन के लिए अगले कोड उपयोग कर रहा हूँ:

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

तो मेरी प्रश्न हैं:

  • मैं कैसे कमांड का अधिकार कनेक्शन सेट कर सकते हैं?
  • मैं कनेक्शन क्यों नहीं बदल सकता? (अगर रिपोर्ट अन्य सर्वर पर बनाई गई थी)।

उत्तर

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); 
      } 
     } 
    } 
} 
संबंधित मुद्दे