0

クリスタルレポートは初めてです。私はかなり長い間この問題を抱えていて、解決できないようです。私がやっていることは、レポートを実行し、生成された PDF を応答で送り返すことです。

問題は、ブラウザーから asp.net ページ (レポートを実行するページ) を実行すると、1 回目または 2 回目は正常に動作しますが、その後はブラウザーが待機し続け、サーバーからの応答が得られないことです。サーバー、エラーさえありません!ロードが長時間続くだけです。サーバーをクリーンに再インストールしましたが、それでも同じ問題が発生します。このページの最初のテストでは、この問題は発生しませんでした。

Crystal レポートは予測不能です。レポートが適切に閉じられていないのか、接続が適切でないためなのかはわかりません。

Windows Server 2003 - IIS ここに vb.net ページがあります -

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim connectionInfo As New ConnectionInfo




        connectionInfo.ServerName = "UID=abc;PWD=abc;Driver= {SQL Server};Server=" & Page.Request.QueryString("server") & ";Database=" & Page.Request.QueryString("database")


    Using report As New ReportDocument
            report.Load(Server.MapPath("/report/Crystal/test.rpt"))
            report.FileName = Server.MapPath("/report/Crystal/test.rpt")

            SetDBLogonForReport(connectionInfo, report)

            report.SetParameterValue("param1",  Page.Request.QueryString("param1"))     



            Dim oStream As New MemoryStream()
            oStream = report.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat)

            Response.Clear()
            Response.Buffer = True
            Response.ContentType = "application/pdf"
            Response.BinaryWrite(oStream.ToArray())
            report.Close()
    End Using


        Response.Flush()
        Response.End()

    End Sub

    Private Sub SetDBLogonForReport(ByVal connectionInfo As ConnectionInfo, ByVal reportDocument As ReportDocument)

        Dim tables As Tables
        tables = reportDocument.Database.Tables

        For Each table As CrystalDecisions.CrystalReports.Engine.Table In tables

            Dim tableLogonInfo As New TableLogOnInfo

            tableLogonInfo = table.LogOnInfo
            tableLogonInfo.ConnectionInfo = connectionInfo
            table.ApplyLogOnInfo(tableLogonInfo)

        Next


    End Sub

</div>

</form>

4

1 に答える 1

2

まず、レポート接続の呼び出しを Page_Load() ではなく、Page_Init() イベントに入れます。.NET 2005 より前は、Page_Load() に入れても問題ありませんでした。しかし、現在はメモリの管理方法が変更されており、CrystalReportViewer のメモリの状態に応じてランダム エラーが発生する可能性があります。Page_Init() に入れることは常に安全です。

次に、次のコードを削除します。 CrystalReportViewer1.DataBind();

また、レポート オブジェクトを割り当てると自動的に更新される RefreshReport() 呼び出し b/c も削除します。でも持っていて損はありません。いずれにせよ、.DataBind() 呼び出しを確実に取り除きます。

これらの変更により、アプリケーションが機能するようになることを願っています。

詳細については、以下のリンクを確認してください。私は一年前に同じ問題に直面しました。参考に なれば幸いですLINK

于 2012-10-03T14:57:11.857 に答える