【问题标题】:Crystal report and problem with connection水晶报表和连接问题
【发布时间】:2011-02-01 15:05:31
【问题描述】:

这个问题给有 CR 经验的人。

我在设置与 Crystal 报表的连接时遇到问题。 我收到了客户的报告。数据库的结构在他和我的服务器上是相同的。但是 server 和 db 的名称不同。 他正在使用“命令”来创建报告(在数据库字段中添加命令-> 数据库专家...)。该命令有一些返回数据的功能。 我尝试在我的计算机上运行此报告,当我尝试执行 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 的正确连接?
  • 为什么我不能更改连接? (如果报告是在其他服务器上创建的)。

【问题讨论】:

    标签: c# crystal-reports


    【解决方案1】:

    几年前我曾经面临同样的问题,然后写了一门课。这是课程:

    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

    【讨论】:

      【解决方案2】:

      您只需要在方法定义中添加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);
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-22
        • 2020-04-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多