【问题标题】:Which one is better - Declaring SqlDataSource in ASPX page or in CodeBehind?哪个更好 - 在 ASPX 页面或 CodeBehind 中声明 SqlDataSource?
【发布时间】:2013-11-15 02:14:47
【问题描述】:

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

【问题讨论】:

  • 两者都不理想,最好有一个从代码隐藏调用的DataAccess 类。
  • “更好”意味着在性能/速度、标准编码实践、代码维护、安全等方面更好。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          我会创建一个 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

          【讨论】:

            【解决方案6】:

            CodeBehind 在大型且不断增长的系统中是可渗透的方式。会很容易的

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

            当然你可以使用某种 ORM。

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

            【讨论】:

              【解决方案7】:

              如果应用程序非常小并且您没有时间进行编码,那么请选择 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

              【讨论】:

                猜你喜欢
                • 2021-10-14
                • 1970-01-01
                • 1970-01-01
                • 2010-11-27
                • 2010-12-25
                • 1970-01-01
                • 1970-01-01
                • 2014-10-27
                • 1970-01-01
                相关资源
                最近更新 更多