Podczas tworzenia raportów często mamy do czynienia z bazami danych, którym daleko do ideału . Różnorodne „funkcjonalności” czasami nas blokują. Na przykład, jak zbudować raport oparty na wielu zbiorach danych, którego wynikiem będą procedury składowane MS SQL? Po utworzeniu źródła danych w raporcie, możemy użyć procedury składowanej w zapytaniu SQL, ale tylko dla konkretnej tabeli. Oznacza to, że będzie ona pobierała tylko pierwszy zestaw danych zwracanych przez procedurę składowaną. W celu wygenerowania wielu tabel z wyników procedury składowanej, należy stworzyć program źródła danych w kodzie własnej aplikacji.
Należy utworzyć połączenie z bazą danych, wykonać procedurę składowaną i wprowadzić jej wyniki do zbioru danych. Następnie przenieść zbiór danych do raportu i zapisać źródło danych w raporcie. W ten sposób podczas tworzenia raportu w projektancie otrzymamy przygotowane źródło danych. Można pójść dalej i programowo połączyć się ze źródłem raportu, aby było już w drzewie danych. Ale najpierw rozważmy pierwszą opcję z prostym dodaniem źródła danych do raportu.
Powiedzmy, że masz kilka aplikacji WinForms, w których generujesz raporty. Dodaj przycisk wywołujący edytor raportów:
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(); } |
W tym miejscu tworzymy obiekt raportu, zatytułowany wiersz połączenia bazy danych MS SQL, tworzymy źródło danych raportu i rejestrujemy go w raporcie. Pobierz źródło danych GetDataSet w następujący sposób:
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; } |
Ta metoda akceptuje parametry połączenia, nazwę procedury składowanej i możliwe parametry dla procedury składowanej. W naszym przypadku nic nie zdaliśmy. Po utworzeniu połączenia z procedurą składowaną bazy danych jest wykonywana. Wyniki jej pracy są umieszczane w dataAdapter.
Na tym etapie mogliśmy już zakończyć artykuł. Powyższy kod wystarczy, aby utworzyć i zarejestrować źródło danych w raporcie, który będzie dostępny w projektancie, podczas edycji utworzonej na początku obiektu raportu.
Gdy Projektant raportów jest otwarty, zostanie wyświetlony pusty szablon raportu. Źródła danych będą musiały wybrać ustawienia:
Możemy jednak poprawić kod i uniknąć dalszych akcji projektowych przy wyborze źródeł danych. Oznacza to, że raport utworzy dodatkowe dane. Aby to zrobić, zakończymy obsługę przycisków:
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(); } |
Jak już zauważyłeś, podpisaliśmy program obsługi zdarzenia pobierania projektanta. Następnie uwzględniamy wszystkie źródła danych w raporcie w pętli. Implementujemy program obsługi dla zdarzenia pobierania projektanta:
1 2 3 4 |
private void DesignerSettings_DesignerLoaded(object sender, EventArgs e) { (sender as Designer).cmdNew.CustomAction += new EventHandler(cmdNew_CustomAction); } |
Przekazujemy wskaźnik do projektanta raportów zdarzeń. obsługi zdarzeń:
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"); } |
Utwórz kreator tworzenia pustego raportu.
W rezultacie podczas edytowania pustego raportu otrzymujemy dodane dane: