0

我有一个使用 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 引用,并确保所有引用都是相同的版本,并确保所有引用都设置为“特定版本”= True。
  4. 我在解决方案中一个项目的 CR 引用上将“复制本地”设置为 True。
  5. 我将调用 **setConnection** 更改为不验证。
  6. 我取消注释 foreach table.ApplyLogOnInfo(tableLogOnInfo) 部分。

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

4

4 回答 4

1

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

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

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

于 2013-09-26T15:30:08.253 回答
0

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

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

希望这是有用的。

于 2014-01-23T12:10:10.043 回答
0

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

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

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

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

希望能帮助到你。

谢谢

于 2013-09-24T21:58:02.783 回答
0

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

于 2013-09-24T23:55:53.850 回答