C# – Crystal Report throws ‘Failed to open the connection.’ only on postback

asp.netccrystal-reportsnetsql server

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.

Best 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.

Related Topic