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

45,331

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.

Share:
45,331
boruchsiper
Author by

boruchsiper

ASP.NET Developer

Updated on May 24, 2020

Comments

  • boruchsiper
    boruchsiper almost 4 years

    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.