C # Winform - So zeigen Sie Echtzeitberichte an, indem Sie 3 Variablen an ReportViewer übergeben, nämlich Reportname (RDL-Datei), SQLstring und Connectionstring

Was ist die eleganteste Methode zum Übergeben von RDL-Dateien, SQL-Anweisungen und Verbindungszeichenfolgen an das ReportViewer-Steuerelement im Winform C # -Projekt zur Anzeige von Berichten zur Laufzeit.

Einführung

Ich habe kürzlich angefangen, an der Berichterstellung unter Windows zu arbeiten. Ich fand heraus, dass RDLC-Dateien als statische Dateien fungieren, ohne dass Verbindungszeichenfolgen oder SQL-Anweisungen erforderlich sind. Daher müssen wir DataSource an sie übergeben, um sie zur Laufzeit mit Daten zu füllen. Dies dient nicht unserem Zweck. RDL-Dateien können jedoch SQL-Anweisungen und Verbindungszeichenfolgen enthalten, die sie in XML-Tags speichern und zum Generieren dynamischer Berichte verwenden.

Gegeben, dass ich

RDL Berichtsvorlage SQL-AnweisungConnection String to Database

Was ist die beste Möglichkeit, diese Informationen in C # Winform an einen ReportViewer zu übergeben, um einen Bericht zu generieren?

1) Für eine RDL, die für ein Bibliotheksverwaltungssystem verwendet wird. (Wir haben keine Kontrolle über diese Dateien, diese werden von den Benutzern unserer Anwendung verwendet.)

  <Query>
    <DataSourceName>DS1</DataSourceName>
    <CommandText>select bk_book_details.id, bk_book_details.book_id, bk_book_details.book_no, bk_book_details.book_name, bk_book_details.edition_id, bk_book_details.condition_id, bk_book_details.publication_year, bk_book_details.price, bk_book_details.purchase_price, bk_book_details.reference_no, bk_book_details.book_status, bk_book_details.purchase_id, bk_book_details.purchase_date from bk_book_details</CommandText>
  </Query>

2) Hier ist die SQL-Anweisung

select bk_book_details.id, bk_book_details.book_id, bk_book_details.book_no, bk_book_details.book_name, bk_book_details.edition_id, bk_book_details.condition_id, bk_book_details.publication_year, bk_book_details.price, bk_book_details.purchase_price, bk_book_details.reference_no, bk_book_details.book_status, bk_book_details.purchase_id, bk_book_details.purchase_date from bk_book_details

3) Hier ist die Verbindungszeichenfolge

server=localhost;User Id=root;password=root;Persist Security Info=True;database=lms

Aktueller Output Wie in der RDLReader.exe-Anwendung zu sehen

Code verwendet, um diese Ausgabe zu erhalten

    private void btnReport_Click(object sender, EventArgs e) {
        string sql = "select bk_book_details.id, bk_book_details.book_id, bk_book_details.book_no, bk_book_details.book_name, bk_book_details.edition_id, bk_book_details.condition_id, bk_book_details.publication_year, bk_book_details.price, bk_book_details.purchase_price, bk_book_details.reference_no, bk_book_details.book_status, bk_book_details.purchase_id, bk_book_details.purchase_date from bk_book_details";
        string RDLReaderApplication = @"""""""" + Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @""\ReaderPath\RDLReader.exe"" + @"""""""";
        string reportFile = @"""""""" + Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @""\Reports\ReportFile.RDL"" + @"""""""";
        string connectionString = @"""""""" + "server=localhost;User Id=root;password=root;Persist Security Info=True;database=lms" + @"""""""";
        Process.Start(RDLReaderApplication, reportFile + "" "" + @"""""""" + sql + @"""""""" + "" "" + connectionString);
    }

Erwartete Ausgabe

Bisherige Arbeit:

Die FormReportForm enthält dasReportViewer Steuerelement, das an das Formular angedockt ist.

Zusätzliche Information

1) Ich möchte, dass die 3 Daten an @ gesendet werdReportViewer Steuerelement, das in einer anderen Form angedockt ist, und lade stattdessen den Bericht in den ReportViewer.

2) Unsere Benutzer teilen keine Verbindung mit uns, sodass wir sie nicht in der RDL-Datei fest codieren können. Die SQL ist in der Regel eine Konstante und die RDL-Datei wird in der Regel einmal pro Bedarf für ein bestimmtes Formular erstellt.

3) Wir verwenden derzeit die MySQL-Datenbank. Aber eine Lösung in jedem gängigen RDBMS wird viel helfen. Ich hoffe, die obige Abfrage gibt ein gutes Bild des Schemas der Tabelle, auf die zugegriffen wird (die Abfrage enthält alle Spalten in der Tabelle).

Hinweis: Bitte Antwort mit RDL-Dateien und nicht mit RDLC-Dateien.

Was hat das Problem für mich endlich gelöst, zusätzlich zu der Antwort von @Reza Aghaei

Die Berichtsdatei enthält Tags für Datenquelle und Dataset direkt am Anfang der RDL-Datei, wie das folgende Snippet

  <DataSets>
    <DataSet Name="Data">
      <Query>
        <DataSourceName>DS1</DataSourceName>

Die Zeile von @Reza Aghaei, in der nach dem Namen von DataSet (Data) und nicht nach DataSourceName (DS1) gefragt wird. Diese Unterscheidung war entscheidend, damit die Berichtsdatei funktioniert.

var rds = new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", this.ReportData);

changed this to:

var rds = new Microsoft.Reporting.WinForms.ReportDataSource("Data", this.ReportData);