【问题标题】:Crystal Report with Subreport failing on Windows 7 x64带有子报表的 Crystal Report 在 Windows 7 x64 上失败
【发布时间】:2014-01-23 20:10:10
【问题描述】:

我有一个使用 Crystal Reports 的 C# .NET WinForms 应用程序。 Crystal 报表在 x32 和 x64 系统上都可以正常运行,但包含子报表的报表除外。任何包含子报告的报告都会失败,并显示以下精彩内容:“Log on failed” at ...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 引用并确保所有引用都是相同的版本,并确保所有引用都设置为“特定版本”= True。
  4. 我在解决方案中一个项目的 CR 引用上将“复制本地”设置为 True。
  5. 我将调用 **setConnection** 更改为不验证。
  6. 我取消了 foreach table.ApplyLogOnInfo(tableLogOnInfo) 部分的注释。

我不确定为什么它现在有效,但确实有效。 table.ApplyLogOnInfo 在我之前尝试的许多排列中都没有注释。也许我从来没有打过这个特定的组合……但我现在不在乎。

【问题讨论】:

    标签: c# .net winforms crystal-reports


    【解决方案1】:

    已解决:我已经让报告工作了。我不确定该解决方案的哪一部分实际上解决了问题,但这些是我采取的步骤。

    1. 我按照以下 aMazing 的建议检查了数据源。 (它已经是 OLE DB)
    2. 我删除了解决方案中所有项目中对 Crystal Reports 的所有引用。
    3. 我重新添加了 Crystal Reports 引用并确保所有引用都是相同的版本,并确保所有引用都设置为“特定版本”= True。
    4. 我在解决方案中一个项目的 CR 引用上将“复制本地”设置为 True。
    5. 我将调用 **setConnection** 更改为不验证。
    6. 我取消了 foreach table.ApplyLogOnInfo(tableLogOnInfo) 部分的注释。

    我不知道为什么它现在有效,但确实有效。 table.ApplyLogOnInfo 在我之前尝试的许多排列中都没有注释。也许我从来没有打过这个特定的组合……但我现在不在乎。

    【讨论】:

      【解决方案2】:

      因为无法添加评论,所以只能这样回复。

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

      在报告和子报告中检查以下内容: 1)右键单击数据源属性 2)选择设置数据源位置 3) 在报告使用的连接上,单击展开属性 4) 确认Database Type = OLE DB (ADO) 和Provider 是SQLOLEDB。

      这解决了我的问题。我已经将它设置为 SQLNative Client 之前失败了。

      希望对你有帮助。

      谢谢

      【讨论】:

      • 数据源已配置为使用 OLE DB,但我已让报告工作。查看我的编辑。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        希望对你有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多