解决方案:Crystal 报告正在从 C# 应用调用抛出 "database logon failed" 或 "Load Report Failed"

Solution: Crystal Report being called from C# app throwing "database logon failed" or "Load Report Failed"

所以本周早些时候我不得不更新一些使用 Crystal 报告的旧代码,每次我尝试更新代码时我都会得到 "Load Report Failed" "Database Logon Failed"

如果您对这些有 运行,您就会非常清楚它们只是 "catch all" 从 crystal 报告 dll 中冒出来的异常。每个三个简单的词,它们可以字面意思是几十种可能的问题中的任何一种......而不仅仅是你所看到的。

数据库登录失败:可能是您的登录错误;可能是您的数据源在报告中设置不正确;可能是您在报告中的字体不受支持。你不知道,因为它不会告诉你!

加载报告失败:可能是您的报告路径不正确;可能是您的用户没有访问 windows/temp 文件夹的权限。可能是报告已损坏。但是你会知道吗?不!你会知道 "Load Report Failed"。

如果你得到其中之一,你会怎么做?

我推荐以下两件事,它们可以让您记录实际错误,看看到底发生了什么。下面列出的每个建议的来源的相关链接:

1) 去获取 sysinternal 的 "Process Monitor" 或 "Procmon"。 Google 不熟悉的company/product;它通常被认为是安全可靠的,但在继续之前请自行做出决定。有关于如何使用它的 youtube 视频,但如果你经常处理专有 dll,这个工具将使你的开发生活在未来更好 100000 倍。

2) 重点来了。首先,让我们确认这对您有用。在有问题的机器上,跳到 C 驱动器(或你的东西所在的任何驱动器)并搜索名为 "crlogger.dll" 的 dll 如果你有它:你很幸运!如果没有...我很抱歉 :( 您可以尝试下面的方法,但它可能不起作用。

Lets add some logging!

转到您的系统属性 -> 环境变量。将以下3添加到系统变量中:

LOGGING_DIR = c:\logging

LOGGING_ENABLED_ASSERT = 1

LOGGING_ENABLED_RUNTIME = 30

保存,如果日志记录文件夹不存在则创建它(或者将上面的设置到其他目录)并返回到您的应用程序。尽你所能打破它。现在跳回日志文件夹和 tada!您现在拥有实际日志。您可以调试真实的实际错误。

就我而言,我遇到了这两个错误。

加载报告失败:我已经安装了 64 位 CR 运行时,但不是它正在寻找的 32 位。我安装了那个,这个错误被击败了。

数据库登录失败:我查看了日志,发现 "Microsoft SQL Server Native Client 11.0 Description: Encryption not supported on the client."。原来是两件事,procman 帮我确定了:

1) 虽然我有 Client 11,但我没有足够新的版本。我去获取了更新的安装程序,特别是“Microsoft® SQL Server® 2012 Native Client - QFE”安装程序。 (我们有2016,但是没有2016原生客户端)

2) 通过 Process Monitor 无法找到这些键可以证明这一点。

无论如何,这应该会让你重新上路。现在您不必猜测哪里出了问题,并且可以真正开始解决问题。

对于你们中的许多人来说,post 现在没有必要。但我想这样做是为了提高知名度,因为有一天,其他一些可怜的开发人员会像我一样通宵达旦,不顾一切地寻找解决方案,最终会来到这里。在找到日志记录之前,我花了将近 30 个小时来解决这个问题,然后在不到 1 小时后解决了问题,因为我实际上有可操作的项目需要处理。

祝大家好运!