2016-03-24 17 views
2

私はASP.NETに熟練しているわけではありませんが、ASP.NET C#で書かれたWebアプリケーションがあります。読み込みに問題がありますデータをデータベースから取り出し、それをテーブルに格納します。以下は私のコードです。基本的には、ロードしようとすると断続的に「ページを表示できません」と表示されます。常にページを読み込むのに約10〜20秒かかるので、間違っていることは分かっています。誰かが私の間違いを指摘できますか?ASP.NET C#SQL Server DataReader

using (SqlConnection dbConn = new SqlConnection(strConnection)) 
{ 
    SqlDataAdapter dbAdapter = new SqlDataAdapter(); 
    SqlCommand dbCommand = new SqlCommand(); 
    dbConn.Open(); 
    // I tried the SET ARTITHABORT portion below based on other posts I found on SO - no better performance though 
    dbCommand.Connection = dbConn; 
    dbCommand.CommandText = "SET ARITHABORT ON";   
    dbCommand.ExecuteNonQuery();   
    dbCommand.CommandText = @"SELECT ID, NAME, PART_NUMBER, BARCODE, QOH, MINIMUM_QOH, LAST_PRICE FROM INVENTORY" + Session["table_extension"].ToString(); 
    dbCommand.Connection = dbConn; 
    SqlDataReader dbReader = dbCommand.ExecuteReader(CommandBehavior.CloseConnection); 

    if (dbReader.HasRows) 
    { 
     strInventoryTable = @"<table id='inventoryTable' cellspacing='0' cellpadding='5' border='0' width='100%'> 
           <thead> 
            <tr> 
             <th>Name</th> 
             <th>Part No.</th> 
             <th>Barcode</th> 
             <th>QOH</th> 
             <th>Min. QOH</th> 
             <th>Last Price</th> 
             <th>Action</th> 
            </tr> 
           </thead> 
           <tbody>"; 
     string rowMarker = "even"; 
     while (dbReader.Read()) 
     { 
      if (rowMarker == "even") 
      { 
       strInventoryTable += "<tr class='even clickable' onclick='location.href=\"edit_product.aspx?id=" + dbReader["ID"] + "\";'>"; 
       rowMarker = "odd"; 
      } 
      else 
      { 
       strInventoryTable += "<tr class='odd clickable' onclick='location.href=\"edit_product.aspx?id=" + dbReader["ID"] + "\";'>"; 
       rowMarker = "even"; 
      } 
      strInventoryTable += "<td>" + dbReader["NAME"] + "</td>";       
      strInventoryTable += "<td class='tdCenter'>" + dbReader["PART_NUMBER"] + "</td>"; 
      strInventoryTable += "<td class='tdCenter'>" + dbReader["BARCODE"] + "</td>"; 
      strInventoryTable += "<td class='tdRight'>" + dbReader["QOH"] + "</td>"; 
      strInventoryTable += "<td class='tdRight'>" + dbReader["MINIMUM_QOH"] + "</td>"; 
      strInventoryTable += "<td class='tdRight'>" + globals.formatMoney(dbReader["LAST_PRICE"].ToString()) + "</td>"; 
      strInventoryTable += "<td class='tdCenter'><a href='edit_product.aspx?id=" + dbReader["ID"] + "'>Edit</a>&nbsp;&nbsp;"; 
      strInventoryTable += "<a href='delete_product.aspx?id=" + dbReader["ID"] + "'>Delete</a></td>"; 
      strInventoryTable += "</tr>"; 
     } 
     strInventoryTable += "</tbody></table>"; 
    } 
    else 
    { 
     strInventoryTable = "<p><strong><em>No inventory found in database</em></strong></p>"; 
    } 
} 
inventoryTable.InnerHtml = strInventoryTable; 

クエリ自体は完了するまでに0.00003秒かかります。だから私はそれがクエリではないことを知っている、と私は約2,400行戻っている。

UPDATE

ボトルネックがあるデバッグしようとしている...ここ

クエリが始まっ結果は以下のとおりです。2016年3月24日9時06分06秒AM

クエリが完成:2016年3月24日9時06分06秒AM

データリーダーが開始:2016年3月24日9時06分06秒AM

データリーダーが終了:3/2 2016分の4九時06分43秒AM

だから私の問題はしばらく(dbReader.Read()){}ループ

+2

"手で"テーブルを作成するのではなく、GridViewを使用したくないですか? – ConnorsFan

+0

このリンクに移動し、GridViewを使用します。http://quickstarts.asp.net/quickstartv20/aspnet/doc/ctrlref/data/gridview.aspx – rashfmnb

+1

これをデバッグすると、ボトルネックはどこにありますか? *推測*、*測定*しないでください。 – David

答えて

5

に間違いである私は本当にのStringBuilderですべての文字列連結を置き換えることをお勧めします。
これらの文字列連結はすべて連続してメモリ内に新しい文字列を作成して割り当てています。

間欠的なエラーは、明らかにストレスがかかるサーバーの症状です。

// Initialize with a big internal buffer 
    // It seems that you have a lot of data but I can't measure from here, you can 
    StringBuilder sb = new StringBuilder(1024*1024);  
    if (dbReader.HasRows) 
    { 
     sb.Append(@"<table id='inventoryTable' cellspacing='0' cellpadding='5' border='0' width='100%'> 
           <thead> 
            <tr> 
             <th>Name</th> 
             <th>Part No.</th> 
             <th>Barcode</th> 
             <th>QOH</th> 
             <th>Min. QOH</th> 
             <th>Last Price</th> 
             <th>Action</th> 
            </tr> 
           </thead> 
           <tbody>"); 
     string rowMarker = "even"; 
     while (dbReader.Read()) 
     { 
      if (rowMarker == "even") 
      { 
       sb.Append("<tr class='even clickable' onclick='location.href=\"edit_product.aspx?id=" + dbReader["ID"] + "\";'>"); 
       rowMarker = "odd"; 
      } 
      else 
      { 
       sb.Append("<tr class='odd clickable' onclick='location.href=\"edit_product.aspx?id=" + dbReader["ID"] + "\";'>"); 
       rowMarker = "even"; 
      } 
      sb.Append("<td>" + dbReader["NAME"] + "</td>"); 
      sb.Apppend("<td class='tdCenter'>" + dbReader["PART_NUMBER"] + "</td>"); 
      ...... 
     } 
     sb.Append("</tbody></table>"); 
    } 
    else 
    { 
     sb.Append("<p><strong><em>No inventory found in database</em></strong></p>"); 
    } 
    inventoryTable.InnerHtml = sb.ToString(); 
+3

私は、WebフォームまたはMVCビューにバックエンドでテーブルHTMLを手作業でコード化しようとする代わりに、テーブルをbuldにすることをお勧めします –

+0

よろしくお願いします!私はこれをして、テーブルが瞬時にロードされる!!!!どうもありがとうございます!!!! StringBuilderは私の英雄です! – Phil

+1

@Philはまだありません。これはまだ醜い、遅い、維持不能です。 *適切な*技術を使用してテーブルを構築します。 * Bootstrapと同じテーブルを作成して、使用した行数をページングすることができます –