2

哪个更好 - 在 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] 更好?为什么?

4

7 回答 7

11

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

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

于 2013-11-04T12:55:07.050 回答
2

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

没有对错之分,但你肯定会SqlDataSource更频繁地看到标记中的声明而不是代码隐藏,因为人们通常更容易理解标记中的某些内容是页面的一部分是在代码隐藏中定义的,即使它们最终都出现在生成的 HTML 中。

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

于 2013-11-04T12:55:18.257 回答
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 {}

并从代码隐藏中调用它

IDataAccess dataaccess = new EFDataAccess(...); 

这将有助于separation of concern. 您希望实施的方式不允许任何code-reuse.

于 2013-11-04T13:01:45.883 回答
1

I wouldn't say one is better. Use the right one depending on what you need to do. If you just need a simple connection, drop it onto the page. If you need to change something conditionally, do it in code.

于 2013-11-04T12:54:53.817 回答
1

对于大型且不断增长的系统,CodeBehind 是一种可渗透的方式。会很容易

  • 支持架构更改
  • 改变“可见性”逻辑
  • 添加缓存
  • 审计和日志记录
  • 等等

当然,您可以使用某种 ORM。

但是,如果您只需要简单的 CRUD 函数,则声明会更快。

于 2013-11-04T12:55:35.807 回答
1

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

于 2013-11-04T12:57:57.977 回答
0

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

  <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>

对于更大的应用程序,您需要使用 Code behind

于 2018-05-07T09:58:39.903 回答