试图保持这种简短:我们的运输人员使用支持Windows Mobile的条形码扫描仪扫描客户订单上的物品序列号 . 该数据通过asmx Web服务提交,报告将自动打印到联网打印机,显示客户信息和发货项目的详细信息 . 所有这些都发生在Intranet环境中 .
直到最近,我还使用Visual Studio内置的Microsoft报表引擎(.rdlc文件)来生成报告,并在没有用户干预的情况下打印出来的代码 . 几年来它一直很好用 .
最近,我遇到了MS Reports中的一些报告格式限制,并在Crystal Reports(10.5.3700)中实现了报告 . 代码工作正常,但在 生产环境 中运行了几个小时到一天或更长时间后,asp.net工作进程挂起(不确定这是否是合适的术语) . 报告生成/打印过程永远运行而不会抛出异常 . 回收AppPool让一切都恢复了一段时间 .
报告使用“推送”模式,其中报告被赋予类型化数据集而不是访问数据库本身 . 为了使CR ReportDocument.PrintToPrinter()方法脱离等式,我考虑将生成的报告导出为PDF或类似文件,然后单独打印生成的文件 . 但我还没有找到一个好方法 .
研究这个问题,我已经阅读了各种关于Crystal的错误的抱怨,但是我希望我的代码中有一个与打印报告后清理有关的错误 .
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.ReportAppServer
Imports CrystalDecisions.Shared
Public Class CrystalReport
Private _report As ReportDocument
Public Sub New(ByVal Path As String)
_report = New ReportDocument()
_report.Load(Path)
End Sub
Public Sub SetDatasource(ByVal DataSet As DataSet)
_report.SetDataSource(DataSet)
End Sub
Public Sub AddParameter(ByVal Name As String, ByVal Value As Object)
Dim crParameterFieldDefinitions As ParameterFieldDefinitions = _report.DataDefinition.ParameterFields
Dim crParameter1 As ParameterFieldDefinition = crParameterFieldDefinitions.Item(Name)
Dim parameterValue As CrystalDecisions.Shared.ParameterDiscreteValue = New CrystalDecisions.Shared.ParameterDiscreteValue()
parameterValue.Value = Value
crParameter1.CurrentValues.Add(parameterValue)
crParameter1.ApplyCurrentValues(crParameter1.CurrentValues)
End Sub
Public Sub Print(ByVal PrinterPath As String)
_report.PrintOptions.PrinterName = PrinterPath
_report.PrintToPrinter(1, True, 0, 0)
Close()
End Sub
Private Sub Close()
_report.Close()
_report.Dispose()
_report = Nothing
End Sub
End Class
有进一步调试的想法吗?我从来没有采用真正的Windows调试(WinDbg,Process Explorer等),因此任何关于首先尝试调试工具的建议都会很棒 .
谢谢 .
1 回答
这听起来好像报告实际上没有被发布,虽然通过查看你的代码,你会认为你正在做的就是这样 .
您可以在ASP.NET页面的
Page_Unload
事件上尝试Close()
和Dispose()
. Microsoft ASP.NET论坛上的This forum post讨论了达到最大量的报告处理作业的问题,但我想这个问题可能是相关的 .