1

早在我开始在这里工作之前,一位开发人员在 VS 2008 中的 VB.Net 中编写了一个 Web 应用程序,其中包含一个使用 Crystal Reports 作为 PDF 文件创建报表的链接。用户向我报告该链接生成错误。我不确定这是否一直是一个问题,现在才被报告,或者服务器是否发生了变化。这是一个应用程序,自从我来到这里以来,我很少参与其中,而编写它的开发人员早已离开公司。自 90 年代后期以来,我就没有使用过 Crystal Reports。无论如何,这里有足够的背景是错误的。

我一直追踪到 objTemp.Export() 方法调用(其中 objTemp 是 Crystal Reports ReportClass 类的实例)。

当我在 Visual Studio IDE 中的机器上本地运行应用程序时,一切都按预期运行。我重新编译并将应用程序发布到生产服务器上的单独文件夹,然后运行我的版本,我仍然得到与生产版本相同的错误。

ASP 错误页面如下所示:

“/MyApplication”应用程序中的服务器错误。

你调用的对象是空的。

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息: System.NullReferenceException:对象引用未设置为对象的实例。

源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

堆栈跟踪:

[NullReferenceException: Object reference not set to an instance of an object.]
    MyApplication.libMyAppFunctions.ExportAndDisplayPDF(Object objTemp) in O:\MyApplication\library\libMyAppFunctions.vb:491
    MyApplication.ViewReport.btnPrint_Click(Object sender, EventArgs e) in O:\MyApplication\aspx\Reports\ViewReport.aspx.vb:1462
    System.Web.UI.WebControls.LinkButton.OnClick(EventArgs e) +111
    System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +79
    System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
    System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
    System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +175
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565


版本信息: Microsoft .NET Framework 版本:2.0.50727.3643;ASP.NET 版本:2.0.50727.3634

我遇到的一个问题是,在错误中它指向“O:\MyApplication ...”。那是我保存源代码的网络驱动器。没有 O: 驱动器映射到服务器。这似乎是错误的根源,但我无法想象硬编码驱动器号是 Visual Studio 开发环境的标准部分。它从未对我编写/工作过的任何其他应用程序造成此类问题。



*添加 3/19/2013 以响应 Andrew 的源代码请求
这是单击创建 PDF 文件的链接时调用的代码。

Private Sub btnPrint_Click(ByVal sender As Object, ByVal e As System.EventArgs) 处理 btnPrint.Click
    暗淡
    将 objViewReport 调暗为 ViewReport = New ViewReport(frmView)
    dtReportComments = objViewReport.getDtReportComments

    暗淡作为对象

    如果 (objViewReport.intTimeOfDayID -1) 那么
        oRpt = 新 rptTOC_DateSpecific()
    别的
        oRpt = 新 rptTOC_DateAll()
    万一
    oRpt.SetDataSource(dtReportComments)

    '设置季节、日期和 TimeOfDay
    将季节调暗为 CrystalDecisions.CrystalReports.Engine.TextObject = oRpt.ReportDefinition.ReportObjects.Item("txtSeason")
    将标题变暗为 CrystalDecisions.CrystalReports.Engine.TextObject = oRpt.ReportDefinition.ReportObjects.Item("txtViewReportDate")
    将 toTimeOfDay 调暗为 CrystalDecisions.CrystalReports.Engine.TextObject = oRpt.ReportDefinition.ReportObjects.Item("txtTimeOfDay")

    toSeason.Text = objViewReport.strSeasonID

    如果 (objViewReport.intTimeOfDayID -1) 那么
        toTitle.Text = objViewReport.datViewReportDate.ToString("MM/dd/yyyy")
        toTimeOfDay.Text = objViewReport.strTimeOfDay
    别的
        toTitle.Text = "全部"
        toTimeOfDay.Text = "全部"
    万一

    ExportAndDisplayPDF(oRpt)
结束子


这是 btnPrint_click 方法调用的代码


Public Function ExportAndDisplayPDF(ByVal objTemp As Object)
    Dim dNow As DateTime = Now

    Dim strFileName As String = dNow.Ticks & ".pdf"
    'write to a pdf file.
    Dim DiskOpts As CrystalDecisions.Shared.DiskFileDestinationOptions = New CrystalDecisions.Shared.DiskFileDestinationOptions()
    objTemp.ExportOptions.ExportDestinationType = CrystalDecisions.[Shared].ExportDestinationType.DiskFile
    objTemp.ExportOptions.ExportFormatType = CrystalDecisions.[Shared].ExportFormatType.PortableDocFormat

    DiskOpts.DiskFileName = HttpContext.Current.Request.PhysicalApplicationPath.ToString & "ReportOutput\" & strFileName

    objTemp.ExportOptions.DestinationOptions = DiskOpts
    Try
        objTemp.Export()
    Catch oRptExcept As Exception
        HttpContext.Current.Response.Write(oRptExcept.Message & "<br><br>" & oRptExcept.InnerException.Message)
    End Try
    HttpContext.Current.Response.Redirect("/MyApplication/aspx/print/Print.aspx?theDestination=" & strFileName)

End Function

只是在寻找解决方案。

谢谢
罗伯特

4

2 回答 2

0

这个问题的答案与 Crystal Reports 完全无关。当您派程序员(我)从事网络管理员工作时,就会发生这种情况。好吧,我知道,你们中的很多聪明人可以同时做到这两点,但我不是你。我在网络方面的经验很少。刚好能过得去。虽然是我虚弱的大脑想通了。

该应用程序的工作方式是将数据读入表格,然后将该数据发送到 Crystal Reports 对象以保存为全新的 PDF 文件。之后,应用程序打开了新的 PDF 文件进行查看。该错误抱怨该对象未实例化。对我来说,这就是编程问题。

这根本不是编程问题。在其中创建新 PDF 文件的文件夹没有运行网站的用户组的写入权限。

如果您没有写入权限,如何创建 PDF?如果您没有写入权限,如何创建 PDF?

于 2013-06-28T19:00:24.850 回答
0

一个老问题,但最近几天我遇到了类似的问题。

通用的“未设置对象引用......”非常具有误导性。像往常一样,已发布的代码在 DEV 和 QA 环境中可以正常工作,但在 PRODUCTION 中会失败。

我将objTemp.Export()更改为objTemp.ExportToHttpResponse(FileName, Response, false, "")它就像一个魅力。

希望这可以帮助某人。

于 2017-07-13T07:16:50.880 回答