Проверьте www.gotreportviewer.com и пример средства просмотра RDL (последний пример справа).В нем уже есть код для загрузки RDLC и синтаксического анализа XML-файла для получения параметров, а также информации о соединении и информации о запросах.Вооружившись этим, вы должны иметь возможность использовать бэкэнд, чтобы получить все, заполнить / загрузить отчет и запустить его.
Если добавить куда-нибудь подсказку или комментарий в RDLC, чтобы указать, какой вызов сделать, я быпредложите, возможно, вместо этого просто использовать имя отчета в качестве подсказки.Мы делали это в прошлом, чтобы наши отчеты знали, что вызывать для загрузки данных.
Мы делали что-то подобное раньше:
VB Версия:
Select Case GetReportName()
Case "SiteEval"
Using adp As New DataSetsTableAdapters.SiteEvalTableAdapter, _
objDT As New DataSets.SiteEvalDataTable
adp.Fill(objDT)
objLR.DataSources.Add(New ReportDataSource("DataSets_SiteEval", objDT))
End Using
Case ....
C # версия:
switch (GetReportName()) {
case "SiteEval":
using (DataSetsTableAdapters.SiteEvalTableAdapter adp = new DataSetsTableAdapters.SiteEvalTableAdapter()) {
using (DataSets.SiteEvalDataTable objDT = new DataSets.SiteEvalDataTable()) {
adp.Fill(objDT);
objLR.DataSources.Add(new ReportDataSource("DataSets_SiteEval", objDT));
}
}
break;
Использование наших XSD и наборов данных для загрузки наших отчетов.В этом случае наши локальные отчеты имеют доступ к БД.В вашем случае вы могли бы воспользоваться этой идеей и заполнить набор данных своими собственными возвращенными данными из звонка в ваш сервис.Это не самый элегантный или самый простой в обслуживании, если у вас большой набор отчетов.
В нашем случае мы сейчас берем пример RDL Viewer и модифицируем его в соответствии с нашими потребностями, так что приведенный выше код не нужен,Мы просто передадим путь к файлу RDLC, и код загрузит все необходимое, прочитав XML-файл RDLC.Однако в этом случае локальный отчет имеет доступ к БД.Было бы несложно, я думаю, изменить его так, чтобы он получал данные из внешнего источника, либо используя приведенную выше идею кода, либо изменяя пример средства просмотра RDL с www.gotreportviewer.com , как мы сейчас делаем.
С измененным примером RDL Viewer у нас есть кое-что подобное в данный момент (все еще работает ...) Код в VB.
Dim r As New Report(Server.MapPath("App_Reports/" & GetReportName() & ".rdlc"), GetReportName())
Dim p As ReportParameterInfoCollection = r.GetParameters() 'read only....
If p.Count > 0 Then
Dim rptParams(p.Count - 1) As ReportParameter
Dim i As Integer = 0
For Each param In p
rptParams(i) = New ReportParameter(param.Name)
rptParams(i).Values.Add("99999999")
i += 1
Next
r.SetParameters(rptParams)
End If
r.LoadReport()
Прощай, уродливый и длинный переключательзаявление.До свидания, нужно знать, как загрузить отчет .... Теперь, если мы можем просто выяснить, как обрабатывать параметры, немного лучше ... Этот код находится в стадии разработки, но пример RDL Viewer заставил нас начать быстро .....
Я тоже играю с тем же, что и с Reflection.Я нашел эту статью, которая делает работу отражения легким.http://www.slimee.com/2009/09/net-using-reflection-to-execute.html
Теперь все, что вам нужно сделать, это передать строку вашей таблицы данных, и она создаст таблицу данных, управляющую отчетом.Поскольку с наборами данных вы всегда будете знать, как он создает имена, вы легко можете с этим работать.
С моей точки зрения, оба подхода - это решения, которые работают над устранением уродливых операторов switch и облегчат выполнение кода.поддерживать.С отражением код намного меньше, но может быть немного медленнее.
В обоих случаях есть проблема волшебной строки.Где-то вдоль линии вы должны передать строку того, что вы хотите запустить.Команда может легко создать соглашение, которое легко решить, хотя ....