三层架构中具有复杂 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的主要内容,如果未能解决你的问题,请参考以下文章

三层架构中Model层的作用?

三层架构分析

面向对象对三层架构的影响?

用户登录——三层架构

关于后台的三层架构

三层网络结构(核心层 汇聚层 接入层)