水晶报表在64位计算机上无法打开。

10
我的报告可以在32位机器上正常工作,但在64位机器上无法打开。由于在其中一个屏幕上加载数据会导致内存问题,因此需要64位系统才能正常运行。
以下是相关信息:
  1. Windows 10 64位
  2. 已安装Crystal Reports 尝试安装了最新版13.0.20并重启电脑,但仍然不起作用。
  3. 应用程序目标框架为4.6.2(我甚至尝试了4.0,但仍然出现相同的错误)
  4. 使用Visual Studio 2017 Community(也尝试过VS 2015)
  5. 平台为x64(而非AnyCPU)
  6. 报告通过传递DataTable生成,没有活动连接或ConnectionString在报告中
  7. 错误消息如下

enter image description here

修改 # 1

  1. Web.config包括useLegacyV2RuntimeActivationPolicy="true"
  2. x86和x64中的DataTables相同enter image description here

修改 # 2

显示报告的源代码如下:

CrystalDecisions.CrystalReports.Engine.ReportClass c = new 
    CrystalDecisions.CrystalReports.Engine.ReportClass();

c.FileName = System.IO.Path.Combine(Root_Path, 
    "Reports", "Prod", mFileName);

c.Load();
c.SetDataSource(dt);  // dt => DataTable
c.SetParameterValue("prmSystemDate", Current_Date);

frmReportViewer v = new frmReportViewer();
v.ReportClass = c;
v.Show();

frmReportViewer的FormLoad事件是:

private void frmReportViewer_Load(object sender, EventArgs e)
        {
            CRViewer.ReportSource =  ReportClass;
            //CRViewer => 
            //CrystalDecisions.Windows.Forms.CrystalReportViewer
        }

我哪里出错了吗?

编辑 #3

x86和x64上的DataTable是相同的。(将datatables保存为xml文件,两个文件完全相同)。

Process Monitor显示我的程序在以下文件上执行了CreateFile操作:

C:\WINDOWS\Microsoft.Net\assembly\GAC_64\CrystalDecisions.Web\v4.0_13.0.2000.0__692fbea5521e1304\CrystalDecisions.Web.dll C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\CrystalDecisions.Web\v4.0_13.0.2000.0__692fbea5521e1304\CrystalDecisions.Web.dll C:\WINDOWS\Microsoft.Net\assembly\GAC\CrystalDecisions.Web\v4.0_13.0.2000.0__692fbea5521e1304\CrystalDecisions.Web.dll C:\WINDOWS\assembly\GAC_64\CrystalDecisions.Web\13.0.2000.0__692fbea5521e1304\CrystalDecisions.Web.dll

所有失败的结果都是PATH NOT FOUND。它成功地运行在

C:\Windows\assembly\GAC_MSIL\CrystalDecisions.Web\13.0.2000.0__692fbea5521e1304\CrystalDecisions.Web.dll

然后同一文件发生了两次BUFFER OVERFLOW

这只发生在x64上。在x86上没有与CrystalDecisions.Web.dll相关的操作。

这表示什么?


你尝试过这个吗?https://stackoverflow.com/questions/7192045/crystal-reports-problem-with-net-4 - Alejandro-2988924
@Alejandro-2988924,配置文件中引用的设置已经存在。 - bjan
@JasonHughes 一旦应用程序成功构建,我认为它不会依赖于VS的版本,可以通过双击exe文件来运行。您可能在谈论报告设计器。 - bjan
@bjan 我知道它可以编译...但是由于他们没有发布VS 2017的exe文件,而且你在VS 2017中遇到了问题,我认为值得一提。来自这里 "VS 2017-测试打开现有应用程序并且可以工作,CR for VS未集成到应用程序中,因此不可用新的CR项目-应完全集成在SP 21中" - Jason Hughes
你介意分享一些代码吗?你如何精确地初始化报表查看器?你是如何精确地设置报表的 DataSource 的?你是否尝试仅传递 DataSet 而不是 DataTable 对象? - Oceans
显示剩余6条评论
5个回答

2

由于您仍在故障排除和寻求帮助,因此这可能不是完整的“答案”,但对于评论来说太长了。值得注意的是,目前SAP不支持VS 2017,这可能与此有关,但我甚至在VS 2010中看到过类似的消息,所以请看下面的猜测...

简短的猜测:将以下内容添加到您的app.config文件中:

<startup useLegacyV2RuntimeActivationPolicy="true"></startup>

更具体地说,目标是.NET,例如:
<startup useLegacyV2RuntimeActivationPolicy="true">
 <supportedRuntime version="v4.0"/>
</startup>

更长的故障排除思路。错误消息通常表明在报表对象中使用DataSet(在此情况下为DataTable)时,它未设置。您可以在使用SetDataSource的地方设置断点并查看是否正确(这是真实情况)。
也有可能我在这里错了,在那个时间点上即使有一个正确设置的DataSet,问题也会稍后在查看器中发生。很久以前我遇到过这样的问题,如果记忆服务,这是我追踪解决方案的路径。
基本上,我的问题是EXE在查看器中使用ADO对象的方式。不知道您的项目的全部信息,我会开始沿着这条路径进行调试。
其他问题是:它在VS 2015中工作吗?它曾经在X64上工作并停止工作吗?它是否对其他操作有效,例如您可以通过编程方式访问报表对象,并且仅在查看器中出现错误?

配置设置已经存在。它从未在x64上工作过。源代码中没有异常。我正在使用“ReportClass”,所以一直顺利进行到最后。错误只出现在查看器上。 - bjan
所以你在逐步执行并查看数据集中是否有数据,然后再使用它吗?还是直到查看器尝试打开报告时才会出现异常?如果在运行时数据集中没有数据或存在奇怪的数据,则应检查连接本身。您是使用ODBC还是一些本地工具? - Jason Hughes
x86和x64中的DataTables是相同的,已在问题中添加了屏幕截图。 - bjan
除非存在一些非常奇怪的情况,比如两者之间的数据类型差异(您可以通过检查或写入XML来查看),否则它似乎真的是一个运行时问题。我没有社区版,只有企业版,但它是VS 2017。我在我的PC上的WinForms应用程序中以x86和x64位模式安装了SP20并运行了一个报告。报告呈现得很好。所以我知道这不是苹果对苹果,但您可能应该仔细检查已安装的文件。SAP提供了一些称为模块的东西,可能会有所帮助......或者使用类似ProcMon的工具查看是否缺少dll或其他内容。 - Jason Hughes
是的,我不知道。你最好确定已经安装了x64的运行时。MSIL表示,我非常确定,它可以是x86或x64(因此请考虑任何CPU)...如果所有其他方法都失败了,你应该联系SAP。在他们发布SP 21之前,我不确定你会得到多少支持。 - Jason Hughes
显示剩余3条评论

0

请确保您已安装了最新的服务包。我目前正在使用SP19,没有任何问题。
我知道找到正确的下载链接可能会很麻烦,这可能对您有所帮助: https://wiki.scn.sap.com/wiki/display/BOBJ/Crystal+Reports%2C+Developer+for+Visual+Studio+Downloads

因为我创建了一个使用CrystalReports提供的查看器的WPF应用程序,所以我还必须在我的App.config中使用以下设置

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" />
</startup>

相同的错误。已安装CR 13.0.20.2399 64位,配置设置已经为 sku=".NETFramework,Version=v4.0" 因为已更改为 .Net 4.0。 - bjan
1
配置文件中重要的部分是 useLegacyV2RuntimeActivationPolicy="true" - Oceans

0

我不知道这对你是否有用,但当我遇到与Server 2012有关的问题时,我找到了以下解决方案。

Framework 4.6会导致Visual Studio的Crystal Reports在IIS和IISExpress DEV中创建Crystalreportsviewer13文件夹的唯一路径。

环境

Crystal Reports for Visual Studio 
Windows 7
Windows 8.x
Windows 2012 Server
Windows 2016
Windows 10 

复现问题
我们已经意识到这个问题。实际上,它与 .Net Framework 4.6 相关,不仅限于 Win10 或 Windows Server 2016 预览版(这些操作系统默认安装了 .Net 4.6)。如果在 Win7 上安装 .Net 4.6,将会出现同样的问题。根本原因是微软通过 Windows 更新提供了 .Net Framework 4.6 的更新,然后 .Net 4.6 的小版本号发生了变化。对于针对 .Net 4.6 应用程序池的 ASP.NET 网站,CR 查看器将尝试从 ..\aspnet_client\system_web\4_6_xx\crystalreportviewers13\ 中查找查看器资源文件(js 和图标)。其中 xx 是 .Net Framework 4.6 的小版本号。在 Win10 RTM 上,它是 4_6_79;在 Win7+.Net 4.6 上,它是 4_6_81,如果用户安装了最近的 KB3098786,则为 4_6_118... 如果 .Net Framework 4.6 的下一个 KB 更新,版本号将再次更改。因此,请为此创建一个 BOSAP 案例。至少在 SP16 中,我们需要添加更多的符号链接以支持不同的 .Net Framework 4.6 小版本。更好的解决方案是更改加载的查看器资源文件路径,例如,指向 IIS 下的虚拟文件夹。这需要在查看器端进行修复,并需要更多的时间,我们将尝试在 SP16 中实现它... 谢谢,Soda

解决方案

我们的开发人员已经意识到了这个问题,我们应该能够在服务包16中提供修复。

这个问题与.Net Framework 4.6有关。

根本原因是微软通过Windows Update提供了更新的.Net Framework 4.6。

ASP.NET网站将针对.Net 4.6应用程序池,CR查看器将尝试从以下位置查找查看器资源文件(js和图标)

..\aspnet_client\system_web\4_6_xx\crystalreportviewers13\

xx是.Net Framework 4.6的小版本。

For example on Win10 RTM, it is 4_6_79;
on Win7+.Net 4.6 it is 4_6_81,
if user installed recent KB3098786 it will be 4_6_118x. 

当下一个KB更新安装了.Net Framework 4.6后,版本号将再次更改。

当前的解决方法是更新Web.Config文件以包含Framework的更新版本

然后将\CrystalReportsViewer13文件夹复制到新路径中:

..\aspnet_client\system_web\4_6_xx\crystalreportviewers13\

有关更新和最新下载,请访问此链接:

http://scn.sap.com/docs/DOC-7824

主页是:

http://scn.sap.com/community/crystal-reports-for-visual-studio


这是一个桌面应用程序。 - bjan

0

安装32位版本的Crystal Reports,即使您的计算机是64位。

我的计算机也是64位,但我使用32位版本的软件,它可以正常工作。


安装了32位版本,但是出现了相同的错误。请查看更新后的“已安装的Crystal Reports”屏幕截图。 - bjan
请查看以下链接:https://stackoverflow.com/questions/43899015/crexport-exe-on-64-bit-system-faile-to-log-on-to-database/44378451#44378451 - 11311212
感谢您的努力,但所提及的问题涉及PeopleSoft驱动程序的位数,并建议使用32位版本的Crystal Reports Runtime并使用平台目标x86构建应用程序。然而,我需要使用x64。 - bjan

0
你的Crystal Report数据源或连接(例如odbc\dao)中是否有32位?而且很奇怪,你已经安装了32位和64位的CR运行时,为什么还要安装Visual Studio的CR版本?我曾经遇到过类似的问题,但是在用DataSet替换32位MDB和DAO之后,一切都变得正常了。我安装了32位和64位的CR运行时。

所有报告都是断开的,我从程序中打开数据表,并将其设置为报告的数据源。 - bjan
1
不确定使用“断开连接”是否足够。也许可以创建一个简单全新的项目,并添加一个Crystal报表文件和一个数据表源,然后再尝试。如果还不行,请尝试其他的DataSet - 右键单击CR报表并将DataSet添加为源。 - louie_nz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接