哪一个更好 - 在ASPX页面或Code Behind中声明SqlDataSource?

时间:2013-11-04 12:51:27

标签: c# asp.net .net sql datasource

哪一个更好 - 在ASPX页面或CodeBehind中声明SqlDataSource?

方法#A。作为程序员,您可以在.aspx页面中定义SqlDataSource,例如:

<asp:SqlDataSource ID="Sql_ID" runat="server" ConnectionString="<%$ ConnectionStrings:Con_Str %>"
    SelectCommand="SELECT * FROM [table_name]">
    <SelectParameters>
        <asp:Parameter Name="user_id"/>
    </SelectParameters>
</asp:SqlDataSource>

方法#B。此外,您可以在C#CodeBehind中执行此操作

using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Con_Str"].ToString()))
{
    string qry = SELECT * FROM [table_name];

    SqlDataAdapter da = new SqlDataAdapter();
    DataTable dt = new DataTable();

    using (SqlCommand cmd = new SqlCommand(qry, conn))
    {
        cmd.Parameters.Add("@user_id", SqlDbType.UniqueIdentifier).Value = user_id;
        da.SelectCommand = cmd;

        try
        {
            conn.Open();
            da.Fill(dt);
            conn.Close();
        }
        catch
        {
            // Do something ;
        }
    }
}

哪种方法[A或B]更好?为什么呢?

7 个答案:

答案 0 :(得分:8)

两者都不是。最好的方法是将数据访问完全与UI分离(到一个单独的项目,或者至少是命名空间,这样你就可以根据需要轻松交换各种实现)。然后,在您的代码隐藏中,只需引用公开的存储库并执行绑定。但是,您的页面代码隐藏不应包含任何数据访问。

尝试对3tier架构进行一些研究。除非它是一个非常基本的应用程序,否则你应该学习如何将它分成多个层。

答案 1 :(得分:2)

我建议在标记中以声明方式声明SqlDataSource,然后根据需要在代码隐藏中引用它。例如,如果您需要根据用户交互或服务调用返回的数据等更改SelectCommand或其他某些属性,

没有正确或错误的方法,但你肯定会看到标记中声明的SqlDataSource比在代码隐藏中更常见,因为人们通常更容易理解标记中的某些内容是在代码隐藏中定义的页面的一部分,即使它们都以生成的HTML结束。

使用代码隐藏来声明事物最有意义的场景是当你动态地执行它并希望能够添加一个以上的控件时。

答案 2 :(得分:1)

我不会说一个更好。根据您的需要使用正确的一个。如果您只需要一个简单的连接,请将其放到页面上。如果您需要有条件地更改某些内容,请在代码中执行此操作。

答案 3 :(得分:1)

在后面的代码中提到会很好。如果您正在关注正确的项目架构师,那么您需要创建DAL(数据访问层),在这种情况下,您需要在代码中维护数据源,并且在单元测试时更容易模拟数据源。

答案 4 :(得分:1)

我会创建一个DataAccess类,它包含调用数据的所有逻辑,例如:

public class AdoDataAccess : IDataAccess {}

IDataAccess将拥有您的方法,然后您可以在具体类中实现这些方法。

然后您的代码将使用IDataAccess来调用实现......如...

IDataAccess dataaccess = new AdoDataAccess(...); <-- this is a lazy way, but just for example purpose.
dataaccess.GetData(...);  

这样,如果您决定替换ADO,将来可能会替换EF,您可以添加一个新的DataAcess,例如......

public class EFDataAccess : IDataAccess {}

并从codebehind

调用它
IDataAccess dataaccess = new EFDataAccess(...); 

这对separation of concern有帮助。您希望实施的方式不允许任何code-reuse

答案 5 :(得分:0)

CodeBehind在系统庞大且不断发展的情况下是可渗透的方式。

很容易
  • 支持架构更改
  • 更改“可见性”逻辑
  • 添加缓存
  • 审计和记录

当然你可以使用某种ORM。

但如果您只需要简单的CRUD功能,则声明更快。

答案 6 :(得分:0)

如果应用程序非常小并且您没有时间进行编码,那么请选择 sql datasource ,因为您不必为此编写一行代码, 您也可以非常轻松地使用网格视图插入更新和删除数据。

  <asp:GridView ID="GridView1"  CssClass="table table-striped table-bordered table-hover" runat="server" AutoGenerateColumns="False" DataKeyNames="UNQ_ID" DataSourceID="SqlDataSource1" EmptyDataText="No Data has been Added." AllowPaging="True" AllowSorting="True">
            <Columns>
                <asp:CommandField ShowEditButton="True"></asp:CommandField>
                <asp:BoundField DataField="UNQ_ID" HeaderText="UNQ_ID" ReadOnly="True" InsertVisible="False" SortExpression="UNQ_ID" Visible="false"></asp:BoundField>
                <asp:BoundField DataField="WucsName" HeaderText="WUCS Name" SortExpression="WucsName"></asp:BoundField>
                <asp:TemplateField HeaderText="Year" SortExpression="Year_ID">
                    <EditItemTemplate>
                        <asp:TextBox runat="server" Text='<%# Bind("Year_ID") %>' ID="TextBox1"></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <%#YearCON(int.Parse(DataBinder.Eval(Container.DataItem,"Year_ID" ).ToString()))%>
<%--                        <asp:Label runat="server" Text='<%# Bind("Year_ID") %>' ID="Label1"></asp:Label>--%>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="Total_Land_Holdings" HeaderText="Total Land Holdings" SortExpression="Total_Land_Holdings"></asp:BoundField>
                <asp:BoundField DataField="Former_Paying_Cess" HeaderText="Former Paying Cess" SortExpression="Former_Paying_Cess"></asp:BoundField>
                <asp:BoundField DataField="Water_Cess_Collected" HeaderText="Water Cess Collected" SortExpression="Water_Cess_Collected">
                </asp:BoundField>

            </Columns>

 <asp:SqlDataSource runat="server" ID="SqlDataSource1"
            ConnectionString='<%$ ConnectionStrings:PMISConnection %>'
            SelectCommand="SELECT * FROM [tbl_CWLWRK_WaterCess]"
            DeleteCommand="DELETE FROM [tbl_CWLWRK_WaterCess] WHERE [UNQ_ID] = @UNQ_ID" InsertCommand="INSERT INTO [tbl_CWLWRK_WaterCess] ([WucsName], [Year_ID], [Total_Land_Holdings], [Former_Paying_Cess], [Water_Cess_Collected]) VALUES (@WucsName, @Year_ID, @Total_Land_Holdings, @Former_Paying_Cess, @Water_Cess_Collected)" UpdateCommand="UPDATE [tbl_CWLWRK_WaterCess] SET [WucsName] = @WucsName, [Year_ID] = @Year_ID, [Total_Land_Holdings] = @Total_Land_Holdings, [Former_Paying_Cess] = @Former_Paying_Cess, [Water_Cess_Collected] = @Water_Cess_Collected WHERE [UNQ_ID] = @UNQ_ID">


    <DeleteParameters>
        <asp:Parameter Name="UNQ_ID" Type="Int32"></asp:Parameter>
    </DeleteParameters>

    <InsertParameters>
        <asp:Parameter Name="WucsName" Type="String"></asp:Parameter>
        <asp:Parameter Name="Year_ID" Type="Int32"></asp:Parameter>
        <asp:Parameter Name="Total_Land_Holdings" Type="Int32"></asp:Parameter>
        <asp:Parameter Name="Former_Paying_Cess" Type="Int32"></asp:Parameter>
        <asp:Parameter Name="Water_Cess_Collected" Type="Int32"></asp:Parameter>
    </InsertParameters>
    <UpdateParameters>
        <asp:Parameter Name="WucsName" Type="String"></asp:Parameter>
        <asp:Parameter Name="Year_ID" Type="Int32"></asp:Parameter>
        <asp:Parameter Name="Total_Land_Holdings" Type="Int32"></asp:Parameter>
        <asp:Parameter Name="Former_Paying_Cess" Type="Int32"></asp:Parameter>
        <asp:Parameter Name="Water_Cess_Collected" Type="Int32"></asp:Parameter>
        <asp:Parameter Name="UNQ_ID" Type="Int32"></asp:Parameter>
    </UpdateParameters>

</asp:SqlDataSource>

对于较大的应用程序,您需要使用代码