Wie man gespeicherte Prozeduren mit mehreren Datensätzen als Ergebnis verwendet

Beim Erstellen von Berichten haben wir es oft mit Datenbanken zu tun, die alles andere als ideal sind. Die verschiedenen "Features" lassen uns manchmal nicht weiterkommen. Wie kann man zum Beispiel einen Bericht erstellen, der auf mehreren Datensätzen basiert, die in den MS SQL gespeicherten Prozeduren resultieren? Wenn Sie eine Datenquelle im Bericht erstellen, können wir eine gespeicherte Prozedur in der SQL-Abfrage verwenden, aber nur für eine bestimmte Tabelle. Das heißt, es wird nur ein erster Satz von Daten genommen, die von der gespeicherten Prozedur zurückgegeben werden. Um mehrere Tabellen der Ergebnisse einer gespeicherten Prozedur zu generieren, müssen wir eine Datenquellen-Software im Code einer benutzerdefinierten Anwendung erstellen.

Sie müssen eine Datenbankverbindung erstellen, die die gespeicherte Prozedur ausführen und ihre Ergebnisse in das Dataset eintragen kann. Dann übertragen wir das Dataset in den Bericht und tragen die Datenquelle in den Bericht ein. Auf diese Weise erhalten wir im Designer die vorbereitete Datenquelle, wenn wir den Bericht erstellen. Wir können noch weiter gehen und uns programmatisch mit der Datenquelle des Berichts verbinden, so dass sie bereits im Datenbaum ist. Aber zunächst betrachten wir die erste Option mit dem einfachen Hinzufügen einer Datenquelle zum Bericht.

Nehmen wir an, Sie haben einige WinForms-Anwendungen, in denen Sie Berichte generieren. Fügen Sie eine Schaltfläche hinzu, um den Berichtseditor aufzurufen:

1
2
3
4
5
6
7
8
private void button1_Click(object sender, EventArgs e)
 {
 Report FReport = new Report();
 SqlConnection conn = new SqlConnection("Data Source=localhost;AttachDbFilename=;Initial Catalog=salesdb;Integrated Security=True;Persist Security Info=False;User ID=;Password=");
 DataSet data = GetDataSet(conn, "Test");
 FReport.RegisterData(data, "NorthWind");
 FReport.Design();
 }

Hier haben wir ein Report-Objekt erstellt, die MS SQL-Datenbank-Verbindungszeile bekannt gegeben, eine Report-Datenquelle erstellt und diese im Report registriert. Rufen Sie die Datenquelle "GetDataSet" wie folgt auf: 

1
2
3
4
5
6
7
8
9
10
11
public DataSet GetDataSet(SqlConnection connection, string storedProcName, params SqlParameter[] params)
 {
 var command = new SqlCommand(storedProcName, connection) { CommandType = CommandType.StoredProcedure };
 command.Parameters.AddRange(params);
 
 var result = new DataSet();
 var dataAdapter = new SqlDataAdapter(command);
 dataAdapter.Fill(result);
 
 return result;
 }

Diese Methode akzeptiert eine Verbindungszeichenfolge, den Namen der gespeicherten Prozedur und die möglichen Parameter für die gespeicherte Prozedur. In unserem Fall haben wir nichts übergeben. Nachdem Sie eine Verbindung zur Datenbank hergestellt haben, wird die gespeicherte Prozedur ausgeführt. Die Ergebnisse ihrer Arbeit werden im dataAdapter abgelegt.

An dieser Stelle hätten wir den Artikel beenden können. Der obige Code reicht aus, um eine Datenquelle in einem Bericht zu erstellen und zu registrieren, die Ihnen im Designer zur Verfügung steht, wenn Sie am Anfang des Berichtsobjekts erstellt bearbeiten.

Wenn der Berichtsdesigner geöffnet ist, sehen Sie eine leere Berichtsvorlage. Die Datenquellen müssen Sie in den Einstellungen wählen:

 

Wir können jedoch den Code verbessern und weitere Designaktionen bei der Auswahl der Datenquellen vermeiden. Das heißt, der Bericht wird eine zusätzliche Datenquelle erstellen. Für diesen Zweck werden wir den Drucktasten- Handler vervollständigen: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void button1_Click(object sender, EventArgs e)
 {
 Report FReport = new Report();
 Config.DesignerSettings.DesignerLoaded += DesignerSettings_DesignerLoaded;
 SqlConnection conn = new SqlConnection("Data Source=localhost;AttachDbFilename=;Initial Catalog=salesdb;Integrated Security=True;Persist Security Info=False;User ID=;Password=");
 DataSet data = GetDataSet(conn, "Test");
 
 FReport.RegisterData(data, "NorthWind");
 // activate all data sources by default
 foreach (DataSourceBase source in FReport.Dictionary.DataSources)
 {
 source.Enabled = true;
 }
 FReport.Design();
 }

Wie Sie bemerkt haben, haben wir den Handler an das Download-Ereignis des Designers gebunden. Als nächstes binden wir alle Datenquellen des Berichts in die Schleife ein. Wir implementieren den Handler für das Download-Ereignis des Designers: 

1
2
3
4
 private void DesignerSettings_DesignerLoaded(object sender, EventArgs e)
 {
 (sender as Designer).cmdNew.CustomAction += new EventHandler(cmdNew_CustomAction);
 }

Wir leiten den Zeiger auf ein Ereignis des Berichtsdesigners weiter. Den Ereignishandler: 

1
2
3
4
5
6
7
8
9
10
 void cmdNew_CustomAction(object sender, EventArgs e)
 {
 Designer designer = sender as Designer;
 
 //StandardReportWizard wizard = new StandardReportWizard(); // you can use any wizard form package
 BlankReportWizard wizard = new BlankReportWizard();
 wizard.Run(designer);
 
 designer.SetModified(this, "EditData");
 }

Wir erstellen einen Assistenten zum Erstellen eines leeren Berichts.

Als Ergebnis erhalten wir beim Bearbeiten eines leeren Berichts die hinzugefügten Daten:

 

Fast Reports
  • 800-985-8986 (Englisch, die USA)
  • +4930568373928 (Deutsch)
  • +55 19 98147-8148 (Portugiesisch)
  • info@fast-report.com
  • 901 N Pitt Str #325 Alexandria VA 22314

© 1998-2024 Fast Reports Inc.
Trustpilot