简体   繁体   English

服务器上的加载报告失败-Crystal Reports

[英]Load Report Failed On Server - Crystal Reports

I have a crystal report viewer page that displays a report perfectly well on my desktop development computer. 我有一个水晶报表查看器页面,可以在我的桌面开发计算机上很好地显示报表。 The code I have used for this viewer page is: 我用于此查看器页面的代码是:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using LoyalitySystem;
using System.Configuration;
using HQ.DatabaseGateway;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using System.IO;

public partial class WebPages_DynamicReports_CrystalReportViewerPage : BasePage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string reportPath = Server.MapPath((string)Utils.GetSessionNavigator(this).GetDataFromCurrentPage(PageParams.Reports.Report));
        ReportDocument rep = new ReportDocument();

        try
        {
            if (!File.Exists(reportPath))
            {
                Response.Write("The specified report does not exist \n");
            }

            rep.Load(reportPath);
            LoadReport(rep);
            this.CrystalReportViewer1.ToolPanelView = CrystalDecisions.Web.ToolPanelViewType.None;
            this.CrystalReportViewer1.HasToggleGroupTreeButton = false;
            this.CrystalReportViewer1.ReportSource = rep;
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
    }

    private bool LoadReport(ReportDocument doc)
    {
        TableLogOnInfo crTableLogonInfo;
        Sections crSections;
        Database crDatabase;
        Tables crTables;
        ReportDocument crSubreportDocument;
        ReportObjects crReportObjects;
        SubreportObject crSubreportObject;

        try
        {
            ConnectionInfo con = new ConnectionInfo();
            con.ServerName = ConfigurationManager.AppSettings["dbsource"];
            con.DatabaseName = Utils.GetSessionNavigator(this).UserData.DatabaseName;
            con.UserID = ConfigurationManager.AppSettings["uid"];
            con.Password = ConfigurationManager.AppSettings["pwd"];
            crDatabase = doc.Database;
            crTables = crDatabase.Tables;

            //loop through all the tables and pass in the connection info
            foreach (CrystalDecisions.CrystalReports.Engine.Table crTable in crTables)
            {
                crTableLogonInfo = crTable.LogOnInfo;
                crTableLogonInfo.ConnectionInfo = con;
                crTable.ApplyLogOnInfo(crTableLogonInfo);
            }

            // set the crSections object to the current report's sections
            crSections = doc.ReportDefinition.Sections;

            // loop through all the sections to find all the report objects
            foreach (Section crSection in crSections)
            {
                crReportObjects = crSection.ReportObjects;
                // loop through all the report objects to find all the subreports
                foreach (ReportObject crReportObject in crReportObjects)
                {
                    if (crReportObject.Kind == ReportObjectKind.SubreportObject)
                    {
                        crSubreportObject = (SubreportObject)crReportObject;

                        // open the subreport object
                        crSubreportDocument = crSubreportObject.OpenSubreport(crSubreportObject.SubreportName);

                        // set the database and tables objects to work with the subreport
                        crDatabase = crSubreportDocument.Database;
                        crTables = crDatabase.Tables;

                        // loop through all the tables in the subreport and 
                        // set up the connection info and apply it to the tables
                        foreach (CrystalDecisions.CrystalReports.Engine.Table crTable in crTables)
                        {
                            crTableLogonInfo = crTable.LogOnInfo;
                            crTableLogonInfo.ConnectionInfo = con;
                            crTable.ApplyLogOnInfo(crTableLogonInfo);
                        }
                    }
                }
            }
        }
        catch (Exception e)
        {
            Response.Write(e.Message);
            return false;
        }

        return true;
    }
}

As previously stated, this works fine when locally hosting my application, but on the production server I am getting Load Report Failed on every report that I run, and from my check to see if the file exists, I can see that the requested file is being found. 如前所述,这在本地托管我的应用程序时可以很好地工作,但是在生产服务器上,我运行的每个报告都出现“加载报告失败”,并且通过检查文件是否存在,可以看到请求的文件是被发现。

My .aspx markup is: 我的.aspx标记是:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="CrystalReportViewerPage.aspx.cs"
    Inherits="WebPages_DynamicReports_CrystalReportViewerPage" %>

<%@ Register Assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"
    Namespace="CrystalDecisions.Web" TagPrefix="cr" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>CrystalReportViewer</title>
</head>
<body>
    <form id="form1" runat="server">
    <cr:CrystalReportViewer ID="CrystalReportViewer1" runat="server" HasCrystalLogo="False" />
    </form>
</body>
</html>

My web.config file contains: 我的web.config文件包含:

    <sectionGroup name="businessObjects">
        <sectionGroup name="crystalReports">
            <section name="rptBuildProvider" type="CrystalDecisions.Shared.RptBuildProviderHandler, CrystalDecisions.Shared, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304, Custom=null"/>
        </sectionGroup>
    </sectionGroup>

        <assemblies>
            <add assembly="CrystalDecisions.CrystalReports.Engine, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
            <add assembly="CrystalDecisions.ReportSource, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
            <add assembly="CrystalDecisions.Shared, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
            <add assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
            <add assembly="CrystalDecisions.ReportAppServer.ClientDoc, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
        </assemblies>
        <buildProviders>
            <add extension=".rpt" type="CrystalDecisions.Web.Compilation.RptBuildProvider, CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/>
        </buildProviders>

And I have installed both CRforVS_redist_install_64bit_13_0_2 and CRforVS_redist_install_32bit_13_0_2 redistributables on my Windows 2008 R2 Datacenter server at different times and both have failed to resolve the issue. 而且我已在不同时间在Windows 2008 R2数据中心服务器上同时安装了CRforVS_redist_install_64bit_13_0_2CRforVS_redist_install_32bit_13_0_2CRforVS_redist_install_64bit_13_0_2 ,并且都无法解决该问题。 The application connects to an Amazon RDS SQL Server Instance, being on an Amazon EC2 instance itself. 该应用程序连接到位于Amazon EC2实例本身上的Amazon RDS SQL Server实例。

I've searched over the internet for some time to find the solution for this issue but apparently the Load Report Failed message is quite broad in its meaning, so I hope that I can solve this problem with help towards this particular instance of the issue. 我已经在互联网上搜索了一段时间,以找到解决该问题的方法,但是显然“ Load Report Failed”消息的含义很广泛,因此我希望我可以在此问题的特殊情况下提供帮助来解决此问题。

I have been stuck with this issue for over a week now so I would be grateful if any help can be offered. 我已经在这个问题上停留了一个多星期,因此,如果能提供任何帮助,我将不胜感激。

This message usually shows that the report is not available using the provided path. 此消息通常表明使用提供的路径无法使用该报告。 If runtime is not installed you will receive different message.In your case everything is installed correctly but the report is not available in reportPath + rpName. 如果未安装运行时,您将收到不同的消息。在您的情况下,所有内容均已正确安装,但该报告在reportPath + rpName中不可用。 You can debug and check were reportPath + rpName is pointing and if the report is really there. 您可以调试并检查reportPath + rpName是否指向,以及报告是否确实存在。 Try to use Path.Combine( reportPath , rpName) - it will add \\ if necessary. 尝试使用Path.Combine(reportPath,rpName)-如有必要,它将添加\\。 Also check if IIS has permission to access the reports in reportPath folder. 还检查IIS是否有权访问reportPath文件夹中的报告。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM