我有一个使用 Crystal Reports 的 C# .NET WinForms 应用程序。Crystal 报表在 x32 和 x64 系统上都可以正常运行,但包含子报表的报表除外。任何包含子报告的报告都会失败,并在 ...VerifyDatabase() 处显示“登录失败”,但仅限于 x64 系统。
过去我已经看到并解决了这个问题,方法是取消选中每次打印时的验证数据库,确保没有数据与报告一起保存,并确保设计器中使用了正确的驱动程序和连接方法。这个问题不会消失,似乎只会影响带有子报表的报表。
解决方案中的所有项目都设置为构建为 x32。x64 系统安装了 CR 32 位运行时。SQL Native Client 也已安装。
我尝试了许多不同的报表准备步骤组合,例如不验证数据库、不刷新报表、验证而不刷新、刷新而不验证......它一直在继续。
以下是目前使用的制备方法:
private T GetReport<T>() where T: ReportDocument, new()
{
var report = new T();
var connectionStringBuilder
= new SqlConnectionStringBuilder(this.ConnectionString);
var connectionInfo = new ConnectionInfo
{
DatabaseName = connectionStringBuilder.InitialCatalog,
UserID = connectionStringBuilder.UserID,
Password = connectionStringBuilder.Password,
ServerName = connectionStringBuilder.DataSource
};
Action<ReportDocument, bool, bool> setConnection = (document, verify, refresh) =>
{
document.DataSourceConnections.Clear();
document.DataSourceConnections[0].SetConnection(
connectionStringBuilder.DataSource,
connectionStringBuilder.InitialCatalog,
connectionStringBuilder.UserID,
connectionStringBuilder.Password
);
document.DataSourceConnections[0].IntegratedSecurity = false;
/*
foreach (Table table in document.Database.Tables)
{
var tableLogOnInfo = table.LogOnInfo;
tableLogOnInfo.ConnectionInfo = connectionInfo;
table.ApplyLogOnInfo(tableLogOnInfo);
}
* */
//document.SetDatabaseLogon(connectionInfo.UserID, connectionInfo.Password, connectionInfo.ServerName, connectionInfo.DatabaseName);
if (verify)
document.VerifyDatabase();
if (refresh)
document.Refresh();
};
for (var index = 0; index < report.Subreports.Count; index++)
{
var subreportName = report.Subreports[index].Name;
var subreport = report.OpenSubreport(subreportName);
setConnection(subreport, false, false);
}
setConnection(report, true, true);
return report;
}
已解决:我已经让报告工作了。我不确定这个解决方案的哪一部分实际上解决了这个问题,但这些是我采取的步骤。
- 我按照以下 aMazing 的建议检查了数据源。(它已经是 OLE DB)
- 我删除了解决方案中所有项目中对 Crystal Reports 的所有引用。
- 我重新添加了 Crystal Reports 引用,并确保所有引用都是相同的版本,并确保所有引用都设置为“特定版本”= True。
- 我在解决方案中一个项目的 CR 引用上将“复制本地”设置为 True。
- 我将调用 **setConnection** 更改为不验证。
- 我取消注释 foreach table.ApplyLogOnInfo(tableLogOnInfo) 部分。
我不确定为什么它现在有效,但确实有效。table.ApplyLogOnInfo 在我之前尝试的许多排列中都没有注释。也许我从来没有打过这个特定的组合......但我现在不在乎。