C # Winform - Как отображать отчеты в реальном времени, передавая в ReportViewer 3 переменные, а именно Reportname (RDL-файл), SQLstring и Connectionstring

Какой самый элегантный способ передать файл RDL, SQL и строку подключения в элемент управления ReportViewer в проекте Winform C # для отображения отчета во время выполнения.

Вступление:

Недавно я начал работать над созданием отчетов в Windows. Я обнаружил, что файлы RDLC действуют как статические файлы без необходимости использования строки подключения или операторов SQL, поэтому нам нужно передать ему DataSource, чтобы заполнить его данными во время выполнения. Это не служит нашей цели.Однако файлы RDL могут содержать операторы SQL и строку подключения, которые они сохраняют в тегах XML и используются для создания динамических отчетов.

Учитывая, что у меня есть

Шаблон отчета RDLОператор SQLСтрока подключения к базе данных

Каков наилучший способ передать эту информацию ReportViewer в C # Winform, чтобы создать отчет?

1) Для RDL, используемого для системы управления библиотекой. (мы не контролируем эти файлы, они используются пользователями нашего приложения).

  <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) Вот инструкция 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) Вот строка подключения

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

Токовый выход: Как видно из приложения RDLReader.exe

Код, используемый для получения этого вывода

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

Ожидаемый результат:

Работа до сих пор:

ФормаReportForm содержитReportViewer Контроль, который пристыкован к форме.

Дополнительная информация:

1) Я хочу, чтобы 3 данные были отправленыReportViewer Контроль, который закреплен в другой форме, и вместо этого загрузите отчет в ReportViewer.

2) Наши пользователи не делятся с нами связью, поэтому мы не можем жестко закодировать его в файле RDL. Обычно SQL является константой, а RDL-файл обычно создается один раз для каждой конкретной формы.

3) Сейчас мы используем базу данных MySQL. Но решение в любой популярной СУБД очень поможет. Я надеюсь, что приведенный выше запрос дает хорошее представление о схеме доступа к таблице (запрос содержит все столбцы в таблице).

Примечание: Пожалуйста, включите ответ с файлами RDL, а не с файлами RDLC.

Что, наконец, решило проблему для меня, в дополнение к ответу @Reza Aghaei

Файл отчета содержит теги для источника данных и набора данных в самом начале файла RDL, как показано в следующем фрагменте

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

Строка из @Reza Aghaei, запрашивающая имя DataSet (Data), а не DataSourceName (DS1). Создание этого различия имело решающее значение для обеспечения работы файла отчета.

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

изменил это на:

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

Ответы на вопрос(1)

Ваш ответ на вопрос