报告保存或电子邮件问题-操作内存不足(Windows窗体.NET应用程序)

2020-09-01 00:21发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中) 您好, 请在下面提供建议...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


您好,

请在下面提供建议:

我正在使用基于Window Form的应用程序和Crystal Report来报告零件。

因此,一旦打开报告,它就会在报告查看器中打开。
当我们单击"保存"按钮或发送电子邮件时,将显示附件错误。 (没有足够的内存用于操作

  • 现在请注意,此错误不会一直出现。当我进行Google搜索时,我发现一些信息表明要清除%TEMP%文件夹。 当我们手动清除此文件夹时,错误消失了。 但是我们可以看到,如果TEMP文件夹再次建立,则该错误会再次出现。 我正在使用Windows10操作系统。
  • 我也尝试使用此ReportDocument.Close和ReportDocument.Dispose方法,但是它的问题运行良好,但是所有其他操作都会中断,例如,如果按下该按钮,则上一个和下一个按钮会抛出空引用错误。 因此,我将不喜欢使用这些2。
  • 我可以使用.NET垃圾收集器(GC.Collect()),该收集器强制从内存中清除非托管资源,但是不建议再次使用它作为.NET最佳实践的一部分。

所以这里的问题是-

1。 您能否解释一下Crystal Report和系统的%TEMP%文件夹之间的关系。 它会在系统的临时文件夹中累积哪些对象。

2。 Crystal Report累积在系统的TEMP文件夹中时,是否具有一定的内存限制,最终不允许再存储?

请对此提供帮助或建议。

谢谢。

此致

阿比拉什

(19.8 kB)
1条回答
Baoming ROSE
2020-09-01 01:13

Crystal不使用Windows磁盘交换空间,而是为每个报表使用其自己的交换空间。 这在TEMP文件夹中。 如果不调用ReportDocument.Close()和ReportDocument.Dispose(),则Crystal不会清理此文件夹中的文件。 诀窍是您不能在用户完成报表之前调用这些。 我通常将它们放在Crystal Viewer所在窗体的OnFormClose事件处理程序中。

此外,Crystal SDK的内部还有一系列COM组件。 不幸的是,.NET不能很好地管理COM组件的内存,因此您需要在处理ReportDocument之后调用GC.Collect()。

Crystal也不总是清除临时文件(如果有) 是一个错误,导致报表无法正常运行。

减轻Crystal中的内存负载的技巧是将尽可能多的数据处理推送到数据库。

1 。 打开"文件">"选项" >>"数据库"下的"使用索引或服务器以提高速度",其中涵盖了所有新报告。 还要在"文件>>报表选项"下将其打开,以覆盖您当前正在使用的报表。

2。 不要在Select Expert中使用Crystal函数。 除了" IsNull()"外,通常无法将它们推送到数据库进行处理。 相反,Crystal会将所有数据带入内存并在那里进行过滤。 如果我将表用于报表(而不是命令),则在需要过滤数据的值时,我会经常找到一种使用SQL表达式而不是Crystal函数的方法-通过这种方式将其推送 进入数据库进行处理。

3。 不要在单个报告中合并多个命令或存储过程。 另外,请勿将命令或存储的proc与报表中的表结合使用。 第三,避免在报告中合并来自多个数据库的表。 所有这些都会导致Crystal将所有数据提取到内存中,然后在那里进行连接,而不是将连接推送到数据库。

4。 如果您的报告仅用于显示摘要数据,但它正在汇总1000多个左右的行,请考虑使用命令在数据库中进行汇总,而不是让Crystal在内存中进行汇总。 有关使用命令的更多信息,请参见我的博客文章:将命令与Crystal ... SCN一起使用时的最佳实践

在交换到磁盘之前,Crystal将使用尽可能多的内存。 然后,它可以使用TEMP文件夹中可用的磁盘。

-Dell

一周热门 更多>