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. ソリューション内の 1 つのプロジェクトの CR 参照で、'Copy Local' を 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. ソリューション内の 1 つのプロジェクトの CR 参照で、'Copy Local' を True に設定しました。
  5. **setConnection** への呼び出しを検証しないように変更しました。
  6. foreach table.ApplyLogOnInfo(tableLogOnInfo) セクションのコメントを外しました。

なぜ今それが機能するのかはわかりませんが、機能します。table.ApplyLogOnInfo は、以前に試した多くの順列でコメント化されていませんでした。多分私はこの特定の組み合わせを打ったことはありません...しかし、私はこの時点で気にしません.

于 2013-09-26T15:30:08.253 に答える
0

コメントが付けられなかったので、この方法でしか返信できませんでした。

どの SQL サーバーを使用していますか? 以前似たようなことがありました。

レポートとサブレポートの両方で次のことを確認します。 1) [データソース プロパティ] を右クリックします。 2) [データソースの場所の設定] を選択します。 3) レポートが使用している接続で、[プロパティ] をクリックして展開します。プロバイダーは SQLOLEDB です。

それは私の問題を解決しました。以前は失敗していた SQLNative Client に設定していました。

それが役に立てば幸い。

ありがとう

于 2013-09-24T21:58:02.783 に答える
0

いずれかのサブレポートに Access データベースまたはその他の 32 ビット データソースがあるかどうかを確認します。

于 2013-09-24T23:55:53.850 に答える
0

私は最近この同じ問題を抱えていました。データソースが設定されていないことが原因であることがわかりました。私の場合は、if ステートメントが正しくないためでした。つまり、次の行が実行されていませんでした。

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

これが役に立つことを願っています。

于 2014-01-23T12:10:10.043 に答える