我已经看过设计器代码,并且我已经看到了在代码隐藏中构建ObjectDataSource的代码,但是这两种方法都通过文本命令或存储过程与数据库直接通信。这似乎是不必要的代码重复,因为我的数据访问层有一个方法已经返回一个数据表,其中包含我需要的数据。
如何以编程方式构建ODS并将其链接到我的数据访问层的方法?
编辑:
感谢所有回答的人。这对我来说非常糟糕。当我最初写这个问题时,有太多我不明白的地方。我应该问的是:
如何以编程方式将.Net Reporting Services报告(* .rdlc)绑定到我的数据访问层中的方法而不是ADO.Net数据集。
请参阅下面的答案。
答案 0 :(得分:2)
为了使用标准.Net DataSet作为Reporting Services报告的数据源,我不得不:
创建一个使用与DAL方法相同的存储过程的ADO DataSet
使用ADO DataSet填充设计器中报告中的字段
在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()
一旦您对此报告进行了测试并对报告感到满意,就可以安全地从项目中排除ADO DataSet。
注意:这远非理想,我可能采取的步骤是不必要的或我错过的东西 让我感到头疼的一件事是,RDLC中的XML包含了不再相关的旧ADO数据集的定义。要删除它们,请右键单击解决方案资源管理器中的rdlc文件,然后在下一个菜单中选择“打开方式”,然后选择XML编辑器。
答案 1 :(得分:1)
这是我的解决方案。我有传统项目,数据层名为&#34; Data&#34;。 现在我的RDLC被托管在主要的Web项目&#34; Web&#34;中。 所以我的.NET类型在&#34;数据&#34;:
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);
对我来说就像是一种魅力。
答案 2 :(得分:0)
您使用对象数据源还是数据表? 从其中一个中做出选择,不要重复
答案 3 :(得分:0)
对象数据源可以绑定到类实现IEnumerable的任何对象。如果您的DAL方法在同一行返回集合或DataTable / DataView或事物。您只需要使用方法的返回值分配对象数据源对象的datasource属性并调用DataBind()。您甚至可以直接使用Data Server Control的DataSource属性并执行相同的操作。
答案 4 :(得分:0)
这个问题并没有多大意义。如果存在ObjectDataSource(ODS),则可能用于填充显示数据的任何控件(最可能通过DataSourceID字段)。在标记页面上,您将看到ODS具有类的名称以及该类上用于检索数据的方法的名称。这并不意味着它正在做两次,这就是你如何设置它。
答案 5 :(得分:0)
当你说数据源直接与数据库通信时,你的意思是SqlDataSource吗?
如果您有数据访问层类,则将其连接到ObjectDataSource相当容易。只是声明地说:
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
SelectMethod="[InsertYourMethodHere]" TypeName="[InsertYourDALClassHere]">
<SelectParameters>
[Add Your Parameters Here]
</SelectParameters>
</asp:ObjectDataSource>
如果使用设计器,可以使用DataObject和DataObjectMethod属性来装饰DAL类。如果您宁愿以编程方式执行此操作,只需在代码隐藏中使用相同的属性。