開發者在 ASP.NET 頁面中撰寫如下程式碼,嘗試根據 Session 中的使用者等級(userid)查詢後續四個等級的使用者資料並綁定至 DataList,但頁面執行後無任何回應,甚至導致伺服器當機:
int id = (int)Session["userid"];
string str = ConfigurationManager.ConnectionStrings["shuju"].ConnectionString;
SqlConnection conn = new SqlConnection(str);
for (int i = id; i < i + 4; i++)
{
string sql = "select * from [user] where grade =" + i;
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd;
DataTable dt = new DataTable();
da.Fill(dt);
DataList1.DataSource = dt;
DataList1.DataBind();
}
迴圈條件 i < i + 4 永遠為真(任何整數皆小於自身加 4),導致無限迴圈,資料庫連線不斷被開啟、查詢、綁定,最終耗盡資源。
應先計算終止值,再以固定上限控制迴圈:
int end = id + 4;
for (int i = id; i < end; i++)
{
// 查詢與綁定邏輯
}
或使用 for (int i = id, j = id + 4; i < j; i++) 一次宣告兩個變數。
SqlConnection 移至迴圈外,搭配 using 區塊確保釋放。cmd.Parameters.AddWithValue("@grade", i)。WHERE grade BETWEEN @start AND @end 單次查詢取回所有資料,再於前端分組顯示,大幅降低資料庫負載。int id = (int)Session["userid"];
int end = id + 4;
string connStr = ConfigurationManager.ConnectionStrings["shuju"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connStr))
{
string sql = "SELECT * FROM [user] WHERE grade BETWEEN @start AND @end";
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@start", id);
cmd.Parameters.AddWithValue("@end", end - 1);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
DataList1.DataSource = dt;
DataList1.DataBind();
}
}
修正迴圈條件並採用批次查詢,不僅解決無限迴圈問題,更能顯著提升效能與安全性。