在Windows 7 x64上子报表失败的Crystal报表

时间:2013-09-24 20:54:09

标签: c# .net winforms crystal-reports

我有一个使用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;
    }

已解决:我已将报告付诸实施。我不确定这个解决方案的哪个部分实际上解决了问题,但这些是我采取的步骤。

  1. 我根据aMazing的建议检查了数据来源。 (它已经是OLE DB)
  2. 我删除了解决方案中所有项目中Crystal Reports的所有引用。
  3. 我重新添加了Crystal Reports引用,并确保所有引用都是相同的版本,并确保所有引用都设置为“Specific Version”= True。
  4. 我在解决方案中的一个项目的CR引用上将“Copy Local”设置为True。
  5. 我将调用更改为** setConnection **以不验证。
  6. 我没有评论foreach table.ApplyLogOnInfo(tableLogOnInfo)部分。
  7. 我不确定它为什么现在有效,但确实如此。 table.ApplyLogOnInfo在我之前尝试的许多排列中都没有被注释。也许我从来没有打过这个特定的组合...但我现在不在乎。

4 个答案:

答案 0 :(得分:0)

因为我无法添加评论,这是我能回复的唯一方式。

您使用的SQL服务器是什么?我之前有过类似的东西。

在报告和子报告中检查以下内容: 1)右键单击“数据源属性” 2)选择“设置数据源位置” 3)在报告使用的连接上,单击“扩展属性” 4)确认数据库类型= OLE DB(ADO)和提供程序是SQLOLEDB。

这解决了我的问题。我把它设置为SQLNative Client,之前失败了。

希望它有所帮助。

由于

答案 1 :(得分:0)

检查是否在任何子报表中都有Access数据库或任何其他32位数据源。

答案 2 :(得分:0)

已解决:我已将报告付诸实施。我不确定这个解决方案的哪个部分实际上解决了问题,但这些是我采取的步骤。

  1. 我根据aMazing的建议检查了数据来源。 (它已经是OLE DB)
  2. 我删除了解决方案中所有项目中Crystal Reports的所有引用。
  3. 我重新添加了Crystal Reports引用,并确保所有引用都是相同的版本,并确保所有引用都设置为“Specific Version”= True。
  4. 我在解决方案中的一个项目的CR引用上将“Copy Local”设置为True。
  5. 我将调用更改为** setConnection **以不验证。
  6. 我没有评论foreach table.ApplyLogOnInfo(tableLogOnInfo)部分。
  7. 我不确定它为什么现在有效,但确实如此。 table.ApplyLogOnInfo在我之前尝试的许多排列中都没有被注释。也许我从来没有打过这个特定的组合...但我现在不在乎。

答案 3 :(得分:0)

我最近遇到了同样的问题。我发现原因是没有设置数据源,在我的情况下是由于if语句不正确,这意味着以下行没有运行:

repdoc.Subreports["SubReportName.rpt"].SetDataSource((DataTable)MyDataTable);

希望这是有用的。