C # Winform - Como exibir relatórios em tempo real, passando 3 variáveis para o ReportViewer, ou seja, Reportname (arquivo RDL), SQLstring e Connectionstring

Qual é a maneira mais elegante de passar arquivos RDL, SQL e seqüência de conexão para o ReportViewer Control no projeto Winform C # para exibir o relatório em tempo de execução.

Introdução:

Recentemente, comecei a trabalhar na criação de relatórios no Windows. Descobri que os arquivos RDLC agem como arquivos estáticos, sem a necessidade de string de conexão ou instruções SQL; portanto, precisamos passar o DataSource para ele para preenchê-lo com dados em tempo de execução. Isso não serve ao nosso propósito.Os arquivos RDL, no entanto, podem receber instruções SQL e String de Conexão, que eles salvam em tags XML e são usados para gerar relatórios dinâmicos.

Dado que eu tenho

Modelo de relatório RDLInstrução SQLCadeia de conexão com o banco de dados

Qual é a melhor maneira de passar essas informações para um ReportViewer em C # Winform, para gerar relatório?

1) Para uma RDL usada para um sistema de gerenciamento de bibliotecas. (não temos controle sobre esses arquivos, eles são usados pelos usuários do nosso aplicativo).

  <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) Aqui está a instrução 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) Aqui está a string de conexão

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

Saída atual: Como visto no aplicativo RDLReader.exe

Código usado para obter essa saída

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

Saída esperada:

Trabalho até agora:

A formaReportForm contém oReportViewer Controle qual está ancorado no formulário.

Informação adicional:

1) Quero que os 3 dados sejam enviados paraReportViewer Control, que está ancorado em um formulário diferente e carrega o relatório no ReportViewer.

2) Nossos usuários não compartilham conexão conosco, portanto, não podemos codificá-la no arquivo RDL. O SQL geralmente é uma constante e o arquivo RDL geralmente é projetado uma vez por necessidade de um formulário específico.

3) Nós usamos o banco de dados MySQL por enquanto. Mas uma solução em qualquer RDBMS popular ajudará muito. Espero que a consulta acima forneça uma boa imagem do esquema da tabela que está sendo acessada (a consulta contém todas as colunas da tabela).

Nota: inclua a resposta nos arquivos RDL e não nos arquivos RDLC.

O que finalmente resolveu o problema para mim, além da resposta dada por @Reza Aghaei

O arquivo de relatório possui tags para fonte de dados e conjunto de dados, logo no início do arquivo RDL, como o seguinte snippet

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

A linha de @Reza Aghaei, solicitando o nome de DataSet (Data) e não DataSourceName (DS1). Fazer essa distinção foi crucial para fazer o arquivo de relatório funcionar.

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

alterou isso para:

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

questionAnswers(1)

yourAnswerToTheQuestion