2012-04-03 11 views
0

Ich hatte eine Aufgabe, einige Crystal Reports neu zu schreiben. Ich habe die Originalberichte circa 1999 gefunden, sie im VS 2008 geöffnet und die Änderungen vorgenommen und gespeichert.Crystal Report mit Objektdatensatz

Nun verweisen sie auf eine Datenbank, die nicht mehr existiert. Also löschte ich diese Datenquelle und fügte eine .NET OBJECT Datenquelle hinzu. Ich habe alles verändert, damit die Felder nun diese neue Datenquelle betrachten.

Meine Absicht war es, den Bericht zu erstellen und während der Laufzeit eine Datentabelle zu übergeben. Diese Tabelle wird erstellt, indem ein erstellter Sproc ausgeführt wird.

Wenn ich es ausführe, bekomme ich die erste Seite des Berichts. Aber wenn ich versuche, Seiten oder Druck zu ändern, erhalte ich eine Fehlermeldung:

Logon failed. Details: crdb_adoplus : Object reference not set to an instance of an object. Error in File C:...\MR01 {8E5164A9-4B01-4019-81E6-87AED65A02DF}.rpt: Unable to connect: incorrect log on parameters

Hier mein Code:

<CR:CrystalReportViewer ID="theCrystalReportViewer" visible="false" runat="server" EnableDatabaseLogonPrompt="false" /> 


     Dim theDataTable As DataTable = tbl 
     theDataTable.TableName = "tableName" 
     Dim oReport As New ReportDocument 

     Dim sRptPath As String = "...Reports\MR01.rpt" 
     oReport.Load(sRptPath) 
     oReport.SetDataSource(theDataTable) 
     'oReport.SetDatabaseLogon("####", "####", "####", "#####") 


     Dim c As ConnectionInfo = New ConnectionInfo() 
     c.ServerName = "####" 
     c.DatabaseName = "####" 
     c.Password = "####" 
     c.UserID = "####" 
     c.Type = ConnectionInfoType.SQL 
     c.IntegratedSecurity = False 

     For i As Integer = 0 To theCrystalReportViewer.LogOnInfo.Count - 1 
      theCrystalReportViewer.LogOnInfo(i).ConnectionInfo = c 
     Next 


     'theCrystalReportViewer.EnableDatabaseLogonPrompt = False 
     'theCrystalReportViewer.DisplayGroupTree = False 
     theCrystalReportViewer.ReportSource = oReport 
     theCrystalReportViewer.DataBind() 

     litMsg.Visible = False 
     theCrystalReportViewer.Visible = True 

Antwort

0

Versuchen nach den Anweisungen hier: http://vb.net-informations.com/crystal-report/vb.net_crystal_report_without_database.htm

Ich glaube, Sie brauchen

Dim c As ConnectionInfo = New ConnectionInfo() 
    c.ServerName = "####" 
    c.DatabaseName = "####" 
    c.Password = "####" 
    c.UserID = "####" 
    c.Type = ConnectionInfoType.SQL 
    c.IntegratedSecurity = False 

    For i As Integer = 0 To theCrystalReportViewer.LogOnInfo.Count - 1 
     theCrystalReportViewer.LogOnInfo(i).ConnectionInfo = c 
    Next 
+0

Danke, aber das ist nicht ganz das, was ich gesucht habe. Dieser Artikel zeigt, wie Sie ein benutzerdefiniertes Dataset manuell füllen und es an den Bericht senden. Ich möchte ein benutzerdefiniertes Dataset erstellen, das von einem Sproc ausgefüllt wird, und dieses an den Bericht senden. – user1310989

+0

Welchen Zweck hat es, die Sproc-Ergebnisse über ein Dataset zu übergeben, statt den Bericht direkt mit dem Sproc zu verbinden? –

0

JGauffin,

: bekommen zu dieser los

Wie Lee bin ich neugierig, warum Sie ein Dataset mit gespeicherten Prozedurdaten laden würden, anstatt die Anmeldeinformationen einfach an den Crystal Report zu übergeben.

In der Tat, der Code, den Sie zeigen, lädt nicht einmal einen Datensatz direkt. Ich schlage vor, Sie haben den Bericht ziehen Daten direkt von dem Datenserver mit Ihrer gespeicherten Prozedur. Dazu müssen Sie nur Anmeldeinformationen für den Zugriff auf den Server festlegen.

Wenn Sie all diesen Code entfernen ...

Dim c As ConnectionInfo = New ConnectionInfo() 
c.ServerName = "####" 
c.DatabaseName = "####" 
c.Password = "####" 
c.UserID = "####" 
c.Type = ConnectionInfoType.SQL 
c.IntegratedSecurity = False 

For i As Integer = 0 To theCrystalReportViewer.LogOnInfo.Count - 1 
theCrystalReportViewer.LogOnInfo(i).ConnectionInfo = c 
Next 

... können Sie diese bequeme Methode wieder einführen:

// this line needs you to replace these arguments with the valid values 
oReport.SetDatabaseLogon("your", "valid", "settings", "here"); 

Dann, wenn Sie nur Probleme auf Paging, Druck sehen und Exportieren sollten Sie sicherstellen, dass Sie die ReportSource weiterhin auf die Ansicht setzen.

if (!IsPostBack) 
{ 
// all your existing code should go in here 
// this includes the SetDatabaseLogon etc. 
// at the right moment, save your oReport in session 
Session["myReportDocument"] = oReport; 
theCrystalReportViewer.ReportSource = oReport; 
} 
else // we are posting back, so make sure the viewer still has the report object 
{ 
theCrystalReportViewer.ReportSource = (ReportDocument)Session["myReportDocument"]; 
} 

Ich hoffe, das bringt Sie auf den richtigen Weg.