C # Winform: cómo mostrar informes en tiempo real pasando 3 variables a ReportViewer, a saber, Nombre del informe (archivo RDL), SQLstring y Connectionstring

¿Cuál es la forma más elegante de pasar el archivo RDL, el SQL y la cadena de conexión al Control ReportViewer en el proyecto Winform C # para mostrar el informe en tiempo de ejecución?

Introducción:

Recientemente comencé a trabajar en la creación de informes en Windows. Descubrí que los archivos RDLC actúan como archivos estáticos sin necesidad de cadenas de conexión o instrucciones SQL, por lo que debemos pasar DataSource a él para llenarlo con datos en tiempo de ejecución. Esto no sirve a nuestro propósito.Sin embargo, los archivos RDL pueden tomar sentencias SQL y cadenas de conexión que guardan en etiquetas XML y se utilizan para generar informes dinámicos.

Dado que tengo

Plantilla de informe RDLInstrucción SQLCadena de conexión a la base de datos

¿Cuál es la mejor manera de pasar esta información a un ReportViewer en C # Winform, para generar un informe?

1) Para un RDL utilizado para un sistema de gestión de bibliotecas. (no tenemos control sobre estos archivos, estos son utilizados por los usuarios de nuestra aplicación).

  <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) Aquí está la declaración 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

3) Aquí está la cadena de conexión

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

Salida de corriente: Como se ve en la aplicación RDLReader.exe

Código utilizado para obtener esta salida

    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);
    }

Rendimiento esperado:

Trabaja hasta ahora:

La formaReportForm contiene elReportViewer Control que está acoplado al formulario.

Información Adicional:

1) Quiero que se envíen los 3 datos aReportViewer Control, que está acoplado en una forma diferente y, en su lugar, carga el informe en ReportViewer.

2) Nuestros usuarios no comparten conexión con nosotros, por lo que no podemos codificarlo en el archivo RDL. El SQL generalmente es una constante y el archivo RDL generalmente se diseña una vez por necesidad para un formulario en particular.

3) Usamos la base de datos MySQL por ahora. Pero una solución en cualquier RDBMS popular ayudará mucho. Espero que la consulta anterior proporcione una buena imagen del esquema de la tabla a la que se accede (la consulta contiene todas las columnas de la tabla).

Nota: Incluya la respuesta con archivos RDL y no con archivos RDLC.

Lo que finalmente resolvió el problema para mí, además de la respuesta dada por @Reza Aghaei

El archivo de informe tiene etiquetas para el origen de datos y el conjunto de datos, justo al comienzo del archivo RDL, como el siguiente fragmento

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

La línea de @Reza Aghaei, que solicita el nombre de DataSet (Data) y no DataSourceName (DS1). Hacer esta distinción fue crucial para que el archivo de informe funcionara.

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

cambió esto a:

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta