我正在开发一个使用Crystal Reports进行报告的应用程序.它在ReportDocument对象中打开一个给定的报告,完成它需要做的事情,然后关闭报告.
using (var report = OpenReport(reportSourceInfo))
{
// Do stuff with the report
report.Close();
}
Run Code Online (Sandbox Code Playgroud)
OpenReport方法对源文件进行一些验证,并返回一个打开的ReportDocument对象.
测试表明,此代码执行了它的目的,并且似乎没有任何问题.我真正建议的问题是当我进行报告项目的代码分析(CA)构建时,我得到以下CA消息:
CA2202:Microsoft.Usage:对象'report'可以在方法'CrystalReportingProvider.ReportExecute(ReportSourceInformation)'中多次处理.为避免生成System.ObjectDisposedException,不应在对象上多次调用Dispose.
现在显然我可以改变代码,所以我没有得到这个CA警告,但我的问题是我应该吗?
Crystal Reports ReportDocument.Close()方法是否可以正确处理资源清理?该消息似乎表明Close方法调用Dispose方法,但这似乎不正确.
任何意见,将不胜感激.
我需要检索运行晶体报告的存储过程的名称.有没有办法在C#中使用CrystalDecisions.CrystalReports.Engine.ReportDocument对象执行此操作?
我似乎无法找到一个属性,它将给我存储过程名称.
这甚至可能吗?我经历过几乎所有我能想到的属性.DataDefinition对象具有公式,参数,组名称和运行总计字段的集合,但不包含数据库字段的集合.
编辑:我需要以编程方式执行此操作,因为我有很多报告.我需要选择跳过报告的实际运行并只执行报告将使用的存储过程.因此,当使用该程序将报告信息插入到数据库中时,我希望能够提取其存储过程并单独存储该信息.