【问题标题】:Bind an ObjectDataSource to an existing method in my Data access layer将 ObjectDataSource 绑定到我的数据访问层中的现有方法
【发布时间】:2008-12-12 16:40:59
【问题描述】:

我看过设计器代码,也看过在代码隐藏中构建 ObjectDataSource 的代码,但是这两种方法都通过文本命令或存储过程直接与数据库通信。这对我来说似乎是不必要的代码重复,因为我的数据访问层已经有一个方法可以返回一个包含我需要用于此报告的数据的数据表。

如何以编程方式构建 ODS 并将其链接到我的数据访问层的方法?

编辑:

感谢所有回答的人。这对我来说措辞很糟糕。当初写这个问题的时候,有太多不明白的地方。我应该问的是:

如何以编程方式将 .Net Reporting Services 报表 (*.rdlc) 绑定到我的数据访问层中的方法而不是 ADO.Net 数据集。

请参阅下面的答案。

【问题讨论】:

    标签: asp.net vb.net data-binding


    【解决方案1】:

    为了使用标准的 .Net 数据集作为 Reporting Services 报告的数据源,我必须:

    1. 创建一个使用与 DAL 方法相同的存储过程的 ADO 数据集

    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 数据集。

    注意:这远非理想,我可能执行了一些不必要的步骤或我错过了一些步骤。
    让我真正头疼的一件事是,RDLC 中的 XML 包含不再相关的旧 ADO 数据集的定义。要删除它们,请右键单击解决方案资源管理器中的 rdlc 文件,然后在下一个菜单中选择“打开方式”,然后选择 XML 编辑器。

    【讨论】:

      【解决方案2】:

      这是我的解决方案。我有一个名为“数据”的数据层的传统项目。 现在我的 RDLC 托管在主 Web 项目“Web”中。 所以“数据”中有我的 .NET 类型:

      Data.Models.Reports.MyRepository

      ;和该类型的方法:

      获取我的报告

      幸运的是,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);
      

      对我来说就像一个魅力。

      【讨论】:

        【解决方案3】:

        您使用对象数据源还是数据表? 从不重复的其中一个中选择一个

        【讨论】:

        • 在代码的其他地方,我将数据绑定到从我的 DAL 方法返回的数据表中。在这种情况下,虽然我绑定到一个 Reporting Services 报表,该报表需要一个 ReportDataSource/ObjectDataSource,而不是一个数据表。
        【解决方案4】:

        对象数据源可以绑定到类实现 IEnumerable 的任何对象。如果您的 DAL 方法返回集合或 DataTable/DataView 或同一行的内容。您只需要使用方法的返回值分配对象数据源对象的数据源属性并调用 DataBind()。您甚至可以直接使用数据服务器控件的 DataSource 属性并执行相同的操作。

        【讨论】:

        • ObjectDataSource 在 .Net 2.0 中似乎没有 .DataSource 属性
        • 他的意思是控件的 DataSource 属性。 ODS 是 DataSource(从技术上讲,要按预期使用它,可以将 DataSourceID 设置为 ODS 控件的 ID)。
        【解决方案5】:

        这个问题没有多大意义。如果有一个 ObjectDataSource (ODS),那么它可能被用来填充显示数据的任何控件(最有可能通过 DataSourceID 字段)。在标记页面上,您将看到 ODS 具有类的名称和该类上用于检索数据的方法的名称。这并不意味着它会执行两次,这就是您设置它的方式。

        【讨论】:

        • 这不允许将参数传递给方法,除非 Parameter = argument 并且一切都在后端解决(我不认为是这样)。
        • 是的。标记允许通过查询字符串和其他方式提供参数,此外,您可以处理选择事件,您可以在其中手动设置参数并将参数添加到 ODS。
        【解决方案6】:

        当你说数据源直接与数据库通信时,你是指SqlDataSource吗?

        如果您有一个数据访问层类,那么将它连接到 ObjectDataSource 是相当容易的。只需声明式执行:

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

        如果您使用设计器,使用 DataObject 和 DataObjectMethod 属性装饰您的 DAL 类可能是明智之举。如果您希望以编程方式执行此操作,只需在代码隐藏中使用相同的属性即可。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-15
          • 1970-01-01
          • 1970-01-01
          • 2017-01-30
          • 2011-08-02
          • 2013-05-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多