三层架构中使用复杂sqldatasource的Gridview

3
我已经实现了一个三层架构,可以在下面的链接中看到:

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();

然而,我的数据源不是一个datatable,它是一个常规的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类型的架构吗?你必须在select中放置一些内容,否则它无法绑定。 - TheTechGuy
2个回答

3

SqlDataSource不适合3层架构。如何处理由您决定。如果要在此处使用正确的3层架构,您需要在数据层中使用一种类似于数据库处理类的东西,具有CRUD操作。

您链接的文章已经清楚地解释了这一点。如果您不想使用DataTable,可以创建自己的POCO对象来处理数据,例如:

public class Order {... }

您的业务层方法应该如下:

List<Order> GetOrders(...) {...}

与数据相关

//CRUD naming convention
List<Order> ReadOrders (...)  {...}

2
罗兰之前的回答已经涉及以下几点:
  1. 分层架构(假设分离 DAL/BL/UI)与使用 SQLDataSource 不相符,因为在使用 SQLDataSource 时没有分离。
  2. 如何在不使用 SQLDataSource 的情况下使用 POCO/Datatables 进行分离。
我将就你问题的最后部分提供我的 0.02 美元意见:
  1. 是否真的需要分离?
好吧,像大多数现实的答案一样。这取决于许多因素。
例如,您采用 3 层架构的主要原因是什么?此设计的某些优点包括更好的可维护性、更好的可测试性甚至更好的可伸缩性。反过来,使用 SQLDataSource 可能会加快开发速度。
我的个人经验是,出于上述原因,通常最好采用分层设计,因此我通常避免使用 SQLDataSource,即使使用 SQLDataSource 的开发速度优势也可以通过使用 CodeSmith 等代码生成器来消除。所以,我根本看不到长期使用 SQLDataSource 的任何好处。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接