Crystal Reports в asp.net - страница продолжает загружаться
Я новичок в кристальных отчетах. У меня была эта проблема в течение достаточно долгого времени, и я не могу решить ее. Что я делаю, так это запускаю отчет и отправляю обратно сгенерированный PDF в ответе.
Проблема в том, что когда я запускаю страницу asp.net (которая запускает отчет) из браузера, она работает нормально первый или второй раз, но затем браузер просто продолжает ждать, и я не получаю никакого ответа от сервер, даже не ошибка! Просто долго грузится. Я даже сделал чистую переустановку сервера, но все еще имею ту же проблему. У меня не было этой проблемы во время первоначального тестирования этой страницы.
Отчеты 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>
1 ответ
Во-первых, поместите вызов в отчет о соединении в событие Page_Init(), а не в Page_Load(). До.NET 2005 было нормально поместить его в Page_Load(). Но теперь они изменили способ управления памятью, и это может привести к случайным ошибкам в зависимости от состояния памяти CrystalReportViewer. Помещать его в Page_Init() всегда безопасно.
Во-вторых, я бы сделал, это удалить код: CrystalReportViewer1.DataBind();
Я бы также удалил вызов RefreshReport(), так как он обновляется автоматически, когда вы назначаете ему объект отчета. Но не больно иметь его. В любом случае, обязательно избавьтесь от вызова.DataBind ().
Надеемся, что эти изменения вернут ваше приложение к работе.
Для более подробной информации, пожалуйста, проверьте ссылку ниже, я столкнулся с той же проблемой год назад. Надеюсь, это полезно