代码之家  ›  专栏  ›  技术社区  ›  Nick

将ObjectDataSource绑定到数据访问层中的现有方法

  •  2
  • Nick  · 技术社区  · 17 年前

    我见过设计器代码,也见过在代码后面构建ObjectDatasource的代码,但是这两种方法都通过文本命令或存储过程直接与数据库通信。对于我来说,这似乎是不必要的代码复制,因为我的数据访问层已经有了一个方法,该方法将返回包含我需要用于此报表的数据的数据表。

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

    编辑:

    感谢所有回答的人。我这方面的措词很差。当我最初写这个问题的时候,有太多我不明白的地方。我应该问的是:

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

    请看下面我的答案。

    6 回复  |  直到 10 年前
        1
  •  2
  •   Michael Myers KitsuneYMG    13 年前

    为了将标准.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
  •  1
  •   SiniÅ¡a Bencetić    10 年前

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

    数据.模型.报告.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
  •  0
  •   mtt    17 年前

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

        4
  •  0
  •   Perpetualcoder    17 年前

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

        5
  •  0
  •   Robert C. Barth    17 年前

    这个问题没有什么意义。如果有一个ObjectDatasource(ODS),那么它可能被用来填充显示数据的任何控件(通常通过datasourceid字段)。在标记页上,您将看到ODS具有类的名称和用于检索数据的类的方法的名称。这并不意味着它要做两次,这只是你设置它的方式。

        6
  •  0
  •   chriscena    17 年前

    当您说数据源直接与数据库通信时,您的意思是sqldatasource吗?

    如果您有一个数据访问层类,那么很容易将它连接到ObjectDatasource。只需声明:

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

    如果使用设计器,则可以用DataObject和DataObjectMethod属性来修饰DAL类。如果您希望以编程方式进行,只需在代码隐藏中使用相同的属性。

    推荐文章