0

我正在使用 Visual Studio 2008、mvc 2 附带的 Crystal 报告。我希望当用户单击链接时生成 PDF 报告。

这是我配置水晶报表的方法

    public ReportClass ConfigureReportClass(string strReportPath, object[] objParameters)
    {
        ReportClass rptH = new ReportClass();
        try
        {
                rptH = new ReportClass();
                rptH.FileName = strReportPath;
                int Count = 0;
                rptH.Load();
                if (objParameters == null)
                    return rptH;
                foreach (object obj in objParameters)
                {
                    ParameterField param = rptH.ParameterFields[Count++];  // first param 
                    param.AllowCustomValues = true;
                    ParameterDiscreteValue Disparam = new ParameterDiscreteValue();
                    Disparam.Value = obj;
                    param.CurrentValues.Add(Disparam);
                }

        }
        catch (Exception ex)
        {
            throw ex;
        }
        return rptH;
    }

和这个把它转换成PDF

        public System.IO.Stream GetPDFStream(CrystalDecisions.CrystalReports.Engine.ReportClass rptClass)
    {
        System.IO.Stream stream = rptClass.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);
        return stream;
    }

这是我在控制器中的操作方法

        public FileResult GetComplaintFile(String ComplaintNumber)
    {
        HomeBLLC objHomeBLLC = new HomeBLLC();
        ReportClass rptH = objHomeBLLC .ConfigureReportClass(Server.MapPath("~/Views/Complaint/ComplaintReport.rpt"), new object[] { ComplaintNumber });
        return File( objHomeBLLC.GetPDFStream(rptH),"application/pdf" );
    }

我可以在 Visual Studio 的设计视图中看到我的报告的预览,但在运行时出现异常

 Logon failed.

详细信息:28000:[Microsoft][ODBC SQL Server Driver][SQL Server]用户“user”登录失败。文件 C:\Windows\TEMP\ComplaintReport {5BDD522D-04DA-48CD-9F43-A9C648F195D9}.rpt 中的错误:无法连接:登录参数不正确。在 CrystalDecisions.ReportAppServer.ConvertDotNetToErom.ThrowDotNetException(Exception e) 在 CrystalDecisions.ReportSource.EromReportSourceBase.ExportToStream(ExportRequestContext reqContext) 在 CrystalDecisions.CrystalReports.Engine.FormatEngine.ExportToStream(ExportRequestContext reqContext) 在 CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToStream(ExportOptions选项)在 CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToStream(ExportFormatType formatType) 在 myapp.BLL.Home.HomeBLLC.GetPDFStream(ReportClass rptClass) 在 F:\myapp\BLL\Home\HomeBLLC.CS:line 1082

在 myapp.Controllers.ComplaintController.GetComplaintFile(String ComplaintNumber) 在 F:\myapp\Controllers\ComplaintController.cs:line 709 在 myapp.Controllers.ComplaintController.Complaint() 在 F:\myapp\Controllers\ComplaintController.cs:line 76在 lambda_method(ExecutionScope , ControllerBase , Object[] ) 在 System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase 控制器, Object[] 参数) 在 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary 2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 参数) 在 System .Web.Mvc.ControllerActionInvoker.<>c_ DisplayClassd.b _a() at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func1 continuation) at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<>c__DisplayClassf.<InvokeActionMethodWithFilters>b__c() at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IListSystem.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) 处的 1 个过滤器、ActionDescriptor actionDescriptor、IDictionary`2 参数)

我的 DSN 配置正确,因为使用相同 DSN 的其他应用程序正在正确运行 Crystal 报表。

提前致谢

4

1 回答 1

0

我错过了基本的东西,在研究了相关问题后,我才知道我忘记在我的配置水晶报告方法中进行身份验证,这是必要的我修改的方法如下

    public ReportClass ConfigureReportClass(string strReportPath, object[] objParameters)
    {
        ReportClass rptH = new ReportClass();
        rptH.FileName = strReportPath;
        int Count = 0;
        rptH.Load();
        rptH.SetDatabaseLogon("myusername", "mypassword");
        try
        {
            if (objParameters == null)
                return rptH;
            foreach (object obj in objParameters)
            {
                ParameterField param = rptH.ParameterFields[Count++];  // first param 
                param.AllowCustomValues = true;
                ParameterDiscreteValue Disparam = new ParameterDiscreteValue();
                Disparam.Value = obj;
                param.CurrentValues.Add(Disparam);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        return rptH;
    }

我唯一添加的是 rptH.SetDatabaseLogon("myusername", "mypassword"); 我的代码及其工作。不知道为什么我必须再次进行身份验证,因为我已经在我的 DSN 中进行了身份验证。欢迎任何建议。

于 2012-08-16T07:06:07.553 回答