我有一个使用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;
}
已解决:我已将报告付诸实施。我不确定这个解决方案的哪个部分实际上解决了问题,但这些是我采取的步骤。
我不确定它为什么现在有效,但确实如此。 table.ApplyLogOnInfo在我之前尝试的许多排列中都没有被注释。也许我从来没有打过这个特定的组合...但我现在不在乎。
答案 0 :(得分:0)
因为我无法添加评论,这是我能回复的唯一方式。
您使用的SQL服务器是什么?我之前有过类似的东西。
在报告和子报告中检查以下内容: 1)右键单击“数据源属性” 2)选择“设置数据源位置” 3)在报告使用的连接上,单击“扩展属性” 4)确认数据库类型= OLE DB(ADO)和提供程序是SQLOLEDB。
这解决了我的问题。我把它设置为SQLNative Client,之前失败了。
希望它有所帮助。
由于
答案 1 :(得分:0)
检查是否在任何子报表中都有Access数据库或任何其他32位数据源。
答案 2 :(得分:0)
已解决:我已将报告付诸实施。我不确定这个解决方案的哪个部分实际上解决了问题,但这些是我采取的步骤。
我不确定它为什么现在有效,但确实如此。 table.ApplyLogOnInfo在我之前尝试的许多排列中都没有被注释。也许我从来没有打过这个特定的组合...但我现在不在乎。
答案 3 :(得分:0)
我最近遇到了同样的问题。我发现原因是没有设置数据源,在我的情况下是由于if语句不正确,这意味着以下行没有运行:
repdoc.Subreports["SubReportName.rpt"].SetDataSource((DataTable)MyDataTable);
希望这是有用的。