boruchsiper boruchsiper - 2 months ago 16
C# Question

Crystal Report throws 'Failed to open the connection.' only on postback

I created a Crystal Report using the "pull" method to get data from SQL Server Express. I export the report to pdf. It works fine but only on pageLoad. I get this error whenever I try to export the report on a postback.

Failed to open the connection.
Details: [Database Vendor Code: 4060 ]Failed to open the connection.
CrystalReportPull {2B7D5D2A-C29F-4F27-AFAD-EEAECD909D08}.rpt
Details: [Database Vendor Code: 4060 ]
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Runtime.InteropServices.COMException: Failed to open the connection.
Details: [Database Vendor Code: 4060 ]Failed to open the connection.
CrystalReportPull {2B7D5D2A-C29F-4F27-AFAD-EEAECD909D08}.rpt
Details: [Database Vendor Code: 4060 ]

Source Error:

Line 58: CrystalTable.ApplyLogOnInfo(logonInfo)
Line 59: Next
Line 60: report.ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, True, "ExportedReport")
Line 61: report.Dispose()
Line 62: End If

Source File: C:\Users\boruch\Dropbox\Korns-ConnectionStr\reports\CreateReport.aspx.vb Line: 60

Stack Trace:

[COMException (0x800002f4): Failed to open the connection.
Details: [Database Vendor Code: 4060 ]
Failed to open the connection.
CrystalReportPull {2B7D5D2A-C29F-4F27-AFAD-EEAECD909D08}.rpt
Details: [Database Vendor Code: 4060 ]]
CrystalDecisions.ReportAppServer.Controllers.ReportSourceClass.Export(ExportOptions pExportOptions, RequestContext pRequestContext) +0
CrystalDecisions.ReportSource.EromReportSourceBase.ExportToStream(ExportRequestContext reqContext) +525

[InternalException: Failed to open the connection.
Details: [Database Vendor Code: 4060 ]
Failed to open the connection.
CrystalReportPull {2B7D5D2A-C29F-4F27-AFAD-EEAECD909D08}.rpt
Details: [Database Vendor Code: 4060 ]]
CrystalDecisions.ReportAppServer.ConvertDotNetToErom.ThrowDotNetException(Exception e) +346
CrystalDecisions.ReportSource.EromReportSourceBase.ExportToStream(ExportRequestContext reqContext) +627
CrystalDecisions.CrystalReports.Engine.FormatEngine.ExportToStream(ExportRequestContext reqContext) +1203
CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToStream(ExportOptions options) +150
CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToHttpResponse(ExportOptions options, HttpResponse response, Boolean asAttachment, String attachmentName) +211
CrystalDecisions.CrystalReports.Engine.ReportDocument.ExportToHttpResponse(ExportFormatType formatType, HttpResponse response, Boolean asAttachment, String attachmentName) +240
reports_CreateReport.Page_SaveStateComplete(Object sender, EventArgs e) in C:\Users\boruch\Dropbox\Korns-ConnectionStr\reports\CreateReport.aspx.vb:60
System.Web.UI.Page.OnSaveStateComplete(EventArgs e) +9644490
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1282


Here is my code in vb.net:

txt_from.Text = Now.Date.AddYears(-1)
txt_to.Text = Now.Date
If IsPostBack Then
Dim report As New ReportDocument()
report.Load(Server.MapPath("~/reports/CrystalReportPull.rpt"), OpenReportMethod.OpenReportByTempCopy)
Dim custID As Integer = -1
If ddl_Customer.SelectedValue <> "" Then
custID = CInt(ddl_Customer.SelectedValue)

End If
report.SetParameterValue(0, txt_from.Text)
report.SetParameterValue(1, txt_to.Text)
report.SetParameterValue(2, custID)


Dim logonInfo As New CrystalDecisions.Shared.TableLogOnInfo()
Dim CrystalTable As CrystalDecisions.CrystalReports.Engine.Table
For Each CrystalTable In report.Database.Tables
logonInfo = CrystalTable.LogOnInfo
logonInfo.ConnectionInfo.ServerName = "BORUCH-PC\SQLEXPRESS"
logonInfo.ConnectionInfo.DatabaseName = ""
logonInfo.ConnectionInfo.UserID = ""
logonInfo.ConnectionInfo.Password = ""

CrystalTable.ApplyLogOnInfo(logonInfo)
Next
report.ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, True, "ExportedReport")
report.Dispose()
End If


I get the same error when I run this code in a button click, or even in pageload if I wrap in in a
if ispostback
clause.

I've tried running this code in prerender, init etc... without success.

Crystal Reports version 13.0, .NET 3.5, SQL Server 2008 Express, VS 2010

Any help would be much appreciated.

Zec Zec
Answer

This is a common problem with embedding Crystal Reports in ASP pages. Essentially, the authentication details are reset on a postback and need to be reassigned in the Page_Init handler. This article provides code examples and a link to MSDN explaining the ConnectionInfo class and how it works in this context. In case that link dies, the solution is in two steps:

First, import these:

Imports CrystalDecisions.Shared
Imports CrystalDecisions.CrystalReports.Engine

Then, in the Page_Init handler, re-apply connection info:

Dim myConnectionInfo As ConnectionInfo = New ConnectionInfo()
Dim myReport As New ReportDocument()
myReport.Load(Server.MapPath("ReportName")) -- name of the crystal report

Dim myTables As Tables = myReport.Database.Tables

For Each myTable As CrystalDecisions.CrystalReports.Engine.Table In myTables
  Dim myTableLogonInfo As TableLogOnInfo = myTable.LogOnInfo
  myConnectionInfo.ServerName = "" -- <SQL servername>
  myConnectionInfo.DatabaseName = "" -- leave database name blank
  myConnectionInfo.UserID = "" -- username
  myConnectionInfo.Password = "" -- password
  myTableLogonInfo.ConnectionInfo = myConnectionInfo
  myTable.ApplyLogOnInfo(myTableLogonInfo)
Next

CrystalReportViewer1.ReportSource = myReport

Note - SO doesn't like VB comments and wants to call them (and subsequent lines) literal strings instead. Used C/Java comment operator instead.