三层架构中具有复杂 sqldatasource 的 Gridview
Posted
技术标签:
【中文标题】三层架构中具有复杂 sqldatasource 的 Gridview【英文标题】:Gridview with complex sqldatasource in 3-tier architecture 【发布时间】:2012-08-05 15:29:04 【问题描述】:我已经实现了一个三层架构,可以在下面的链接中看到
http://geekswithblogs.net/edison/archive/2009/04/05/a-simple-3-tier-layers-application-in-asp.net.aspx
在上面的示例中,它使用 DataTable 作为 sqldatasource 并使用以下代码将其绑定到 gridview。
GridView1.DataSource = Client.GetClients();
GridView1.DataBind();
但是我的数据源不是数据表,它是一个常规的 sqldatasource,您可以在其中编辑、删除和更新。所以我不知道如何将它与我的表示层分开,还是应该真正分开?这是我的sqldatasource的代码:
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:MyDbConn %>"
DeleteCommand="DELETE FROM [OrderDetail] WHERE [RowNo] = @RowNo" InsertCommand="INSERT INTO [OrderDetail] ([FileNo], [PONumber], [MaterialCode], [MaterialDescription], [MaterialCategory], [UnitOfMeasure], [Quantity], [ContainerType], [LoadingDate]) VALUES (@FileNo, @PONumber, @MaterialCode, @MaterialDescription, @MaterialCategory, @UnitOfMeasure, @Quantity, @ContainerType, @LoadingDate)"
SelectCommand="SELECT * FROM [OrderDetail]" UpdateCommand="UPDATE [OrderDetail] SET [FileNo] = @FileNo, [PONumber] = @PONumber, [MaterialCode] = @MaterialCode, [MaterialDescription] = @MaterialDescription, [MaterialCategory] = @MaterialCategory, [UnitOfMeasure] = @UnitOfMeasure, [Quantity] = @Quantity, [ContainerType] = @ContainerType, [LoadingDate] = @LoadingDate WHERE [RowNo] = @RowNo">
<DeleteParameters>
<asp:Parameter Name="RowNo" Type="Int32" />
</DeleteParameters>
<InsertParameters>
<asp:Parameter Name="FileNo" Type="Int32" />
<asp:Parameter Name="PONumber" Type="String" />
<asp:Parameter Name="MaterialCode" Type="String" />
<asp:Parameter Name="MaterialDescription" Type="String" />
<asp:Parameter Name="MaterialCategory" Type="String" />
<asp:Parameter Name="UnitOfMeasure" Type="String" />
<asp:Parameter Name="Quantity" Type="Int32" />
<asp:Parameter Name="ContainerType" Type="String" />
<asp:Parameter Name="LoadingDate" Type="String" />
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name="FileNo" Type="Int32" />
<asp:Parameter Name="PONumber" Type="String" />
<asp:Parameter Name="MaterialCode" Type="String" />
<asp:Parameter Name="MaterialDescription" Type="String" />
<asp:Parameter Name="MaterialCategory" Type="String" />
<asp:Parameter Name="UnitOfMeasure" Type="String" />
<asp:Parameter Name="Quantity" Type="Int32" />
<asp:Parameter Name="ContainerType" Type="String" />
<asp:Parameter Name="LoadingDate" Type="String" />
<asp:Parameter Name="RowNo" Type="Int32" />
</UpdateParameters>
</asp:SqlDataSource>
【问题讨论】:
这看起来不像 MVC 类型的架构吗?你必须在选择中放一些东西,否则它不能被绑定 【参考方案1】:SqlDataSource 不适合 3 层架构。 怎么做取决于你。您不必将其分开,但如果您想在这里拥有适当的 3 层架构,您需要在数据层中使用某种具有 CRUD 操作的数据库处理类。
您链接的文章清楚地解释了这一点。如果你不想使用 DataTable,你可以创建自己的 POCO 对象来处理类似的数据
public class Order ...
您的业务层方法如下所示
List<Order> GetOrders(...) ...
和数据
//CRUD naming convention
List<Order> ReadOrders (...) ...
【讨论】:
【参考方案2】:上面罗兰的回答已经解决了:-
-
关于分层架构(假设 DAL / BL / UI 的拆分)如何与使用 SQLDataSource 不相关,因为在使用 SQLDataSource 时没有这种分离。
如何在不使用 SQLDataSouce 的情况下使用 POCO/数据表将其分离出来
关于你问题的最后一部分,我会给出 0.02 美元:-
-
真的要分开吗?
嗯,就像最现实的答案一样。这取决于。
这取决于诸如 - 您拥有 3 层架构的主要原因是什么?这种设计的一些优点包括更好的可维护性、更好的可测试性甚至更好的可扩展性。相反,使用 SQLDataSource 可能会加快您的开发速度。
我个人的经验是,由于上述某些原因,分层设计通常是一个更好的主意,因此我通常会避免使用 SQLDataSource,甚至 SQLDataSource 的开发速度优势也可以通过使用代码来抵消 - CodeSmith 等生成器。所以,从长远来看,我根本看不到使用 SQLDataSource 的任何好处
【讨论】:
以上是关于三层架构中具有复杂 sqldatasource 的 Gridview的主要内容,如果未能解决你的问题,请参考以下文章