Привязать ObjectDataSource к существующему методу в моем слое доступа к данным

Я видел код конструктора, и я видел код, который создает ObjectDataSource в коде, однако оба метода взаимодействуют напрямую с базой данных с помощью текстовых команд или хранимых процедур. Это кажется ненужным дублированием кода для меня, так как у моего уровня доступа к данным уже есть метод, который возвращает данные с данными, которые мне нужны для этого отчета.

Как программно построить и связать ODS с методом уровня доступа к данным?

РЕДАКТИРОВАТЬ:

Спасибо всем, кто ответил. Это было очень плохо сформулировано с моей стороны. Было слишком много, чего я не понял, когда писал этот вопрос изначально. Что я должен был спросить:

Как программно связать отчет .Net Reporting Services (* .rdlc) с методом в моем уровне доступа к данным вместо ADO.Net DataSet.

Смотрите мой ответ ниже.

12.12.2008 16:40:59
6 ОТВЕТОВ

Вы используете объект источника данных или данных? выбрать один из них, чтобы не дублировать

0
12.12.2008 16:54:31
В других местах кода я связываю данные с данными, возвращенными из моего метода DAL. В этом случае я связываюсь с отчетом служб Reporting Services, который ожидает ReportDataSource / ObjectDataSource, а не datatable.
Rob Allen 12.12.2008 17:48:55

Объектный источник данных может связываться с любым объектом, класс которого реализует IEnumerable. Если ваш метод DAL возвращает коллекции или DataTable / DataView или вещи в одной строке. Вам просто нужно присвоить свойству datasource объекта datasource объекта значение возврата метода и вызвать DataBind (). Вы даже можете напрямую использовать свойство DataSource элемента управления Data Server и делать то же самое.

0
12.12.2008 16:55:02
У ObjectDataSource, по-видимому, нет свойства .DataSource в .Net 2.0
Rob Allen 12.12.2008 17:47:34
Он имеет в виду свойство DataSource элемента управления. ODS является источником данных (ну, технически, чтобы использовать его по назначению, можно было бы установить для DataSourceID идентификатор элемента управления ODS).
Robert C. Barth 12.12.2008 22:38:15

Вопрос не имеет большого смысла. Если есть ObjectDataSource (ODS), то он, вероятно, используется для заполнения любого элемента управления, отображающего данные (наиболее вероятно, через поле DataSourceID). На странице разметки вы увидите, что в ODS есть имя класса и имя метода этого класса для извлечения данных. Это не значит, что он делает это дважды, просто вы его настраиваете.

0
12.12.2008 22:40:40
Это не позволяет передавать аргументы в метод, если только Parameter = arguments и все это не решено в бэкэнде (что я не думаю, что это так).
Rob Allen 12.12.2008 22:44:23
Да, это так. Разметка позволяет параметры через строку запроса и другие вещи, кроме того, вы можете обрабатывать событие выбора, в котором вы можете вручную устанавливать и добавлять параметры в ODS.
Robert C. Barth 15.12.2008 18:04:21

Когда вы говорите, что источник данных связывается напрямую с базой данных, вы имеете в виду SqlDataSource?

Если у вас есть класс слоя доступа к данным, его довольно легко подключить к ObjectDataSource. Просто сделайте это декларативно:

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
SelectMethod="[InsertYourMethodHere]" TypeName="[InsertYourDALClassHere]">
<SelectParameters>
[Add Your Parameters Here]
</SelectParameters>
</asp:ObjectDataSource>

Если вы используете конструктор, может быть разумно украсить ваш класс DAL с помощью атрибутов DataObject и DataObjectMethod. Если вы предпочитаете делать это программно, просто используйте те же свойства в вашем коде.

0
12.12.2008 23:04:50
РЕШЕНИЕ

Чтобы использовать стандартный .Net DataSet в качестве источника данных для отчета служб отчетов, мне пришлось:

  1. Создайте набор данных ADO, который использует ту же хранимую процедуру, что и метод DAL

  2. Используйте набор данных ADO для заполнения полей в отчете в конструкторе

  3. На странице aspx используйте следующее:

    <rsweb:ReportViewer ID="ReportViewer1" runat="server" Font-Names="Verdana"
                        Font-Size="8pt" Height="655px" Width="980px">
        <ServerReport ReportServerUrl="" />
        <LocalReport>
    
        </LocalReport>
    </rsweb:ReportViewer>

    И в коде позади:

    ReportViewer1.ProcessingMode = ProcessingMode.Local
    Dim report As LocalReport = ReportViewer1.LocalReport
    report.ReportPath = "<your report path>"
    report.DataSources.Clear()
    
    Dim rds As New ReportDataSource()
    rds.Name = "<dataset name>_<stored proc name>"
    rds.Value = <your DAL method ()>
    
    report.DataSources.Add(rds)
    report.Refresh()
  4. После того, как вы проверили это и освоили полученный отчет, вы можете безопасно исключить ADO DataSet из вашего проекта.

Примечания: Это далеко от идеала, и есть вероятные шаги, которые я сделал, которые излишни или что-то я пропустил.
Одна вещь, которая доставила мне настоящую головную боль, заключалась в том, что XML в RDLC содержал определения для старых наборов данных ADO, которые больше не были актуальны. Чтобы удалить их, щелкните правой кнопкой мыши файл rdlc в обозревателе решений и выберите «Открыть с помощью», а затем «Редактор XML» в следующем меню.

2
27.09.2012 22:19:56

Вот мое решение. У меня есть традиционный проект с уровнем данных под названием «Данные». Теперь мои RDLC размещены в основном веб-проекте "Web". Итак, мой тип .NET в «Данные»:

Data.Models.Reports.MyRepository

; и метод в этом типе:

GetMyReport

К счастью, ReportDataSource имеет метод перегрузки Add, который принимает IDataSource в качестве второго параметра. Как только вы поняли, что все ясно.

//Create object data source
ObjectDataSource objDataSource = new ObjectDataSource();
objDataSource.TypeName = "Data.Models.Reports.MyRepository";
objDataSource.SelectMethod = "GetMyReport";
//Add parameters if any ...
objDataSource.SelectParameters.Add("Param1", "");

Здесь магия. Источник данных объекта вполне приемлем в качестве второго параметра в конструкторе

ReportDataSource rptDataSource = new ReportDataSource("DataSet1",objDataSource);
reportViewer.LocalReport.DataSources.Add(rptDataSource);

Работает как шарм для меня.

1
13.10.2015 11:21:30