3 votes

Crystal Report lance 'Impossible d'établir la connexion.' uniquement sur postback

J'ai créé un rapport Crystal en utilisant la méthode "pull" pour récupérer des données de SQL Server Express. J'exporte le rapport au format pdf. Cela fonctionne bien mais seulement lors du chargement de la page. J'obtiens cette erreur chaque fois que j'essaie d'exporter le rapport sur un postback.

Échec de l'ouverture de la connexion.
Détails: [Code fournisseur de base de données : 4060] Échec de l'ouverture de la connexion.
CrystalReportPull {2B7D5D2A-C29F-4F27-AFAD-EEAECD909D08}.rpt
Détails: [Code fournisseur de base de données : 4060]
  Description: Une exception non gérée s'est produite lors de l'exécution de la requête web actuelle. Veuillez consulter la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.

Détails de l'exception: System.Runtime.InteropServices.COMException: Échec de l'ouverture de la connexion.
Détails: [Code fournisseur de base de données : 4060] Échec de l'ouverture de la connexion.
CrystalReportPull {2B7D5D2A-C29F-4F27-AFAD-EEAECD909D08}.rpt
Détails: [Code fournisseur de base de données : 4060]

Fichier source: C:\Users\boruch\Dropbox\Korns-ConnectionStr\reports\CreateReport.aspx.vb Ligne: 60

Trace de la pile:

[COMException (0x800002f4): Échec de l'ouverture de la connexion.
Détails: [Code fournisseur de base de données : 4060]
Échec de l'ouverture de la connexion.
CrystalReportPull {2B7D5D2A-C29F-4F27-AFAD-EEAECD909D08}.rpt
Détails: [Code fournisseur de base de données : 4060]]
   CrystalDecisions.ReportAppServer.Controllers.ReportSourceClass.Export(ExportOptions pExportOptions, RequestContext pRequestContext) +0
   CrystalDecisions.ReportSource.EromReportSourceBase.ExportToStream(ExportRequestContext reqContext) +525

[InternalException: Échec de l'ouverture de la connexion.
Détails: [Code fournisseur de base de données : 4060]
Échec de l'ouverture de la connexion.
CrystalReportPull {2B7D5D2A-C29F-4F27-AFAD-EEAECD909D08}.rpt
Détails: [Code fournisseur de base de données : 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) en 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

Voici mon code en 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

J'obtiens la même erreur lorsque j'exécute ce code dans un clic sur un bouton, ou même dans pageload si je l'encadre dans une clause if ispostback.

J'ai essayé d'exécuter ce code dans prerender, init etc... sans succès.

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

Toute aide serait grandement appréciée.

4voto

Zec Points 803

C'est un problème courant avec l'intégration de Crystal Reports dans les pages ASP. Fondamentalement, les détails d'authentification sont réinitialisés lors d'un postback et doivent être réaffectés dans le gestionnaire Page_Init. Cet article fournit des exemples de code et un lien vers MSDN expliquant la classe ConnectionInfo et comment elle fonctionne dans ce contexte. Au cas où ce lien serait obsolète, la solution se fait en deux étapes :

Tout d'abord, importer ces éléments :

Imports CrystalDecisions.Shared
Imports CrystalDecisions.CrystalReports.Engine

Ensuite, dans le gestionnaire Page_Init, réappliquer les informations de connexion :

Dim myConnectionInfo As ConnectionInfo = New ConnectionInfo()
Dim myReport As New ReportDocument()
myReport.Load(Server.MapPath("NomRapport")) -- nom du rapport Crystal

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 = "" -- 
  myConnectionInfo.DatabaseName = "" -- laisser le nom de la base de données vide
  myConnectionInfo.UserID = "" -- nom d'utilisateur
  myConnectionInfo.Password = "" -- mot de passe
  myTableLogonInfo.ConnectionInfo = myConnectionInfo
  myTable.ApplyLogOnInfo(myTableLogonInfo)
Next

CrystalReportViewer1.ReportSource = myReport

Remarque - SO n'aime pas les commentaires VB et veut les appeler des chaînes littérales à la place. Utilisé l'opérateur de commentaire C/Java à la place.

0voto

Syed Raza Khan Points 1
    Essayez
        Dim myConnectionInfo As ConnectionInfo = New ConnectionInfo()
        Dim rpt As New rptCardPrinting()

        Dim myTables As Tables = rpt.Database.Tables

        For Each myTable As CrystalDecisions.CrystalReports.Engine.Table In myTables
            Dim myTableLogonInfo As TableLogOnInfo = myTable.LogOnInfo
            myConnectionInfo.ServerName = sqlconn
            myConnectionInfo.DatabaseName = ""
            myConnectionInfo.UserID = sqluser
            myConnectionInfo.Password = sqlpass
            myTableLogonInfo.ConnectionInfo = myConnectionInfo
            myTable.ApplyLogOnInfo(myTableLogonInfo)
        Next
        frmReportViewer.CrystalReportViewer1.ReportSource = rpt

        rpt.SetParameterValue("prt", txtCnicPassport.Text)
        rpt.PrintToPrinter(1, False, 0, 0)
        rpt.Close()
        rpt.Dispose()

    Catch ex As Exception
        MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)

    End Try

    '' \\endreport

'''''''''''''''''''''' Après de nombreuses années de développement, j'ai trouvé la solution.... Profitez...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X