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 dadosQual é 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);