以下哪个代码在 ASP.NET 2.0 中性能更好

Posted

技术标签:

【中文标题】以下哪个代码在 ASP.NET 2.0 中性能更好【英文标题】:which of following code is better performance wise in ASP.NET 2.0 【发布时间】:2012-10-25 20:46:50 【问题描述】:

我一直在使用数据表来显示我的网站中 SQL 2005 数据库表中的一些字段,该网站是在 ASP.NET 2.0 中构建的。

最近它抛出超时错误,说所有最大连接池已达到。

这是我使用 SqlDataAdapter 在 Repeater OnDataItemBound 上执行此操作的代码。

#region repeater item databound
    protected void rProducts_OnItemDataBound(object source, RepeaterItemEventArgs e)
    

        // displaying sale and original price //
        Label lblitemid = e.Item.FindControl("itemID") as Label;
        decimal strOP;
        decimal strSP;
        string salequery = "select SaleItemNo, OriginalPrice, SalePrice, OriginalPriceRange, SalePriceRange from SaleItems where CatalogItemId='" + lblitemid.Text + "'";
        SqlConnection myconnection1 = new SqlConnection(ConfigurationManager.ConnectionStrings["DBconnection"].ConnectionString);
        SqlCommand SqlCmd1 = null;
        SqlCmd1 = new SqlCommand(salequery, myconnection1);
        SqlDataAdapter ad1 = new SqlDataAdapter(SqlCmd1);
        DataTable dt1 = new DataTable();
        ad1.Fill(dt1);

        Label lbloriprice = e.Item.FindControl("originalprice") as Label;
        if (dt1.Rows[0]["OriginalPrice"].ToString() == "" || dt1.Rows[0]["OriginalPrice"].ToString() == "0.00")
        
            lbloriprice.Attributes.Add("style", "display:none");
        
        else
        
            strOP = Convert.ToDecimal(dt1.Rows[0]["OriginalPrice"].ToString());
            lbloriprice.Text = strOP.ToString("c");
        

        Label lbloprange = e.Item.FindControl("opRange") as Label;
        if (dt1.Rows[0]["OriginalPriceRange"].ToString() != "")
        
            lbloprange.Text = dt1.Rows[0]["OriginalPriceRange"].ToString();
            lbloprange.Visible = true;
            lbloriprice.Visible = false;
        

        Label lblsaleprice = e.Item.FindControl("saleprice") as Label;
        if (dt1.Rows[0]["SalePrice"].ToString() == "" || dt1.Rows[0]["SalePrice"].ToString() == "0.00")
        
            lblsaleprice.Attributes.Add("style", "display:none");
        
        else if (dt1.Rows[0]["SalePriceRange"].ToString() != "")
        
            lblsaleprice.Text = "Special <br />" + dt1.Rows[0]["SalePriceRange"].ToString();
        
        else
        
            strSP = Convert.ToDecimal(dt1.Rows[0]["SalePrice"].ToString());
            lblsaleprice.Text = "Special <br />" + strSP.ToString("c");
        

    

    #endregion

它在 ad1.fill(dt1) 上抛出错误

我重新设计了我的代码,想知道这是否会减少或消除错误。请指教

   #region repeater item databound
    protected void rProducts_OnItemDataBound(object source, RepeaterItemEventArgs e)
    

        // displaying sale and original price //
        Label lblitemid = e.Item.FindControl("itemID") as Label;

        SqlDataSource SqlDataSource2 = new SqlDataSource();
        SqlDataSource2.ID = "SqlDataSource2";
        SqlDataSource2.ConnectionString = ConfigurationManager.ConnectionStrings["DBconnection"].ConnectionString;
        SqlDataSource2.SelectCommand = "select SaleItemNo, OriginalPrice, SalePrice, OriginalPriceRange, SalePriceRange from SaleItems where CatalogItemId='" + lblitemid.Text + "'";

        Repeater rep = e.Item.FindControl("rpt2") as Repeater;
        rep.DataSource = SqlDataSource2;
        rep.DataBind();

     
#endregion

【问题讨论】:

尝试新代码时会发生什么?没有人能猜出这段代码是否有帮助,因为很难猜出性能问题出在哪里。 您应该考虑使用参数,而不是将用户输入直接附加到您的选择中。它使您容易受到 SQL 注入攻击。 【参考方案1】:

您的SqlCommandSqlConnectionSqlDataAdapter 都需要在using 块中。您的连接可能真的用完了,因为您没有及时关闭它们。


using 块示例:

using (SqlConnection myconnection1 = new SqlConnection(ConfigurationManager.ConnectionStrings["DBconnection"].ConnectionString))

    using (SqlCommand sqlCmd1 = new SqlCommand(salequery, myconnection1))
    
        using (SqlDataAdapter ad1 = new SqlDataAdapter(sqlCmd1))
        
            dt1 = new DataTable();
            ad1.Fill(dt1);
        
    

【讨论】:

嗨,约翰,我认为 SqlDataAdapeter 会自动打开和关闭,您能否给我一个在块中使用它们的示例。欣赏它 您好 John 感谢您的回复,在上面的示例中应该打开和关闭连接。欣赏它 我认为SqlDataAdapter 会为你做到这一点,否则,在Fill 之前会很好。 谢谢,但是如何使用块访问外部数据表,以便我可以将值绑定到一些标签先生

以上是关于以下哪个代码在 ASP.NET 2.0 中性能更好的主要内容,如果未能解决你的问题,请参考以下文章

对于 asp.net 中的会话状态模式,InProc 或 SQL Server 哪个更好?

Asp.Net 2.0 PostBackUrl 的问题

在 ASP.NET 中将具有小数语言中性的价格值转换为整数

asp.net mvc 和 web api 哪个更好 Http POST 或 PUT

求助winform基础知识

GridView 对比HTML 表格 (ASP.net 2.0)