首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL Server 避坑指南:for 迴圈條件判斷錯誤導致無限迴圈

     編輯:程式設計綜合問答

問題現象

開發者在 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 區塊確保釋放。
  • 使用參數化查詢:防止 SQL 注入,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();
    }
}

修正迴圈條件並採用批次查詢,不僅解決無限迴圈問題,更能顯著提升效能與安全性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved