2011-06-21 4 views
3

J'utilise ....Crystal Report Échec de la connexion Problème

Framework 3.5 C# Visual Studio 2008 et application web

J'ai créé des rapports en utilisant Dataset-à-dire mon service me donne ensemble de données et je lient que ensemble de données avec rapport. Mais parfois, la visionneuse CR a commencé à afficher l'erreur "Echec de l'ouverture de session" avec la boîte de connexion avec le nom de l'ensemble de données renseigné dans les informations de connexion.

Je suis à la recherche de sa solution depuis un certain temps mais je n'ai pas trouvé de réponse appropriée à cette question.

+0

Pouvez-vous écrire du code? –

Répondre

2

Après de longs efforts j'ai figuré la raison principale, il y avait une erreur dans ma procédure stockée qui renvoyait des données. SP renvoie les données de la table1 ou de la table2 (elles ont toutes deux la même structure), mais lorsque je sélectionnais des données de la table 2, je n'écrivais pas tous les noms de colonne requis.

Cela semble assez bizarre, je devrais obtenir quelque chose comme erreur de colonne introuvable au lieu de l'échec de connexion à la base de données.

3

Êtes-vous le long de votre passage creditials dans votre code:

ReportDocument rep = new ReportDocument(); 
rep.FileName = Server.MapPath("CrystalReport1.rpt"); 
set.SetDatabaseLogon("username", "password", "sql-server", "database"); // this line pass the login parameters required for login 
+0

Je lie mon rapport en utilisant un ensemble de données comme celui-ci: - ' DataSet ds = getReportData(); rpt.SetDataSource (ds); CrystalReportViewer1.ReportSource = rpt; ' ' maintenant que dois-je mettre en nom d'utilisateur/mot de passe etc? car je ne pense pas qu'il y ait de mot de passe pour l'ensemble de données. –

+0

Où récupérez-vous les données de votre ensemble de données (base de données, fichier CSV, fichier texte, etc.)? –

1

Essayez ceci. Assurez-vous également que vous avez la bonne version du rapport de cristal dans tous les lieux

private ConnectionInfo crConnectionInfo = new ConnectionInfo(); 
     ReportDocument rpt = new ReportDocument(); 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      CrystalReportViewer1.Width = 900; 
      CrystalReportViewer1.ToolPanelView = ToolPanelViewType.None; 
      BindReport(); 
     } 

     private void BindReport() 
     { 

      rpt.Load(Server.MapPath("ProductList.rpt")); 
      DataSet ds = getReportData(); 
      rpt.SetDataSource(ds.Tables[0]); 
      CrystalReportViewer1.ReportSource = rpt; 
     } 

     private DataSet getReportData() 
     { 
      DataSet ds = new DataSet(); 
      string ConnectionString = ConfigurationManager.ConnectionStrings["myconn"].ConnectionString; 
      SqlConnection con = new SqlConnection(ConnectionString); 
      SqlCommand cmd = new SqlCommand(); 
      cmd.CommandText = "GetProductList"; 
      cmd.CommandType = CommandType.StoredProcedure;    
      con.Open(); 
      cmd.Connection = con; 
      SqlDataAdapter sda = new SqlDataAdapter(cmd); 
      sda.Fill(ds, "ctable"); 
      con.Close(); 
      return ds; 
     } 
+0

Dans mon cas, le rapport fonctionne parfois tout en me donnant une erreur de temps. Aussi, je me rends compte qu'il est heureux pour certains dossiers particuliers. Les détails d'exception ne m'ont pas donné une idée de la raison pour laquelle cela se produit. –

+0

Avez-vous essayé mon code Avez-vous l'invite sur cliquez sur la page suivante dans un rapport. Une autre chose utilisez-vous des sous-rapports. Faites-vous l'ensemble de données au moment du design – Tassadaque

1

Je faisais face à la même question à l'époque, quand je me suis déplacé l'application de la machine de développement au serveur réel. C'était une application IIS7 MVC (CR 13.0) avec une authentification de confiance au serveur SQL.

La façon dont je l'ai résolu, était en créant un nouveau pool d'applications pour l'application. Je donne la permission pour le nouvel utilisateur du pool d'applications IIS APPPOOL\applicationpoolname à la base de données du serveur SQL qui a été utilisée dans l'application. Ensuite, l'erreur est partie. Ma supposition est que le userlogininfo appliqué par le code n'est pas toujours utilisé par l'exécution CR, à la place il utilise les informations de connexion de l'utilisateur IIS.

3

Cette erreur est malheureusement ambiguë car c'est l'erreur générée pour des dizaines de problèmes sans rapport. Dans ce cas, la "Connexion échouée" est probablement due à une non-concordance de schéma occasionnelle.

L'objet DataSet peut contenir des données hiérarchiques. Si votre service renvoie un DataSet contenant des données hiérarchiques et que certains des enfants sont manquants, alors son schéma a effectivement changé.

Il existe plusieurs façons de garantir que le DataSet a un schéma correspondant. Si vous êtes des objets sérialisation en XML, puis générer le DataSet à partir de ce XML, alors un moyen simple de réaliser un schéma cohérent est de changer votre code de:

reportData.ReadXml(new MemoryStream(Encoding.UTF8.GetBytes(reportXml))); 

à

reportData.ReadXmlSchema(schemaPath); 
reportData.ReadXml(
     new MemoryStream(Encoding.UTF8.GetBytes(reportXml)), 
     XmlReadMode.IgnoreSchema 
    ); 

où les points de schemaPath à un fichier XSD qui a été généré plus tôt dans le développement avec un appel à

File.WriteAllText(
     @"C:\MyTempPath\MyReportName.xsd", 
     reportData.GetXmlSchema(), 
     Encoding.Unicode 
    ); 

Lors de la génération du schéma, vous voulez aussi que le schéma soit aussi complet d'un rééd Si possible, vous devez utiliser autant de hiérarchie de données que possible. C'est également le XML dont le rapport doit être créé pour que son schéma corresponde. Si le schéma change, le rapport doit être ouvert dans le concepteur avec les nouvelles données et vous devez "vérifier la base de données", puis enregistrer le fichier RPT.