早在我开始在这里工作之前,一位开发人员在 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
只是在寻找解决方案。
谢谢
罗伯特