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

WinForm ListBox 點擊行更新 SQL Server 數據庫完整實戰

     編輯:程式設計疑難解答

需求拆解

  1. 按鈕查詢:StuSelect=0 的學生姓名顯示在 ListBox。
  2. 點擊 ListBox 某行:將該生 StuSelect 置 1,下次查詢自動排除。

關鍵技術點

  • ListBox 綁定顯示文本(StuName)與隱藏值(StuId)
  • SelectedIndexChanged 事件獲取選中行的 StuId
  • 參數化 SQL 防注入,ExecuteNonQuery 執行更新

完整代碼實現

1. 窗體設計

  • btnQuery:查詢按鈕
  • lbStudents:ListBox,屬性 DisplayMember="StuName"、ValueMember="StuId"

2. 查詢綁定

private void btnQuery_Click(object sender, EventArgs e) {
    string connStr = "Server=.;Database=School;Uid=sa;Pwd=123;";
    string sql = "SELECT StuId, StuName FROM Students WHERE StuSelect = 0";
    
    using (SqlConnection conn = new SqlConnection(connStr))
    using (SqlDataAdapter da = new SqlDataAdapter(sql, conn)) {
        DataTable dt = new DataTable();
        da.Fill(dt);
        lbStudents.DataSource = dt;
        lbStudents.DisplayMember = "StuName";
        lbStudents.ValueMember = "StuId"; // 關鍵:隱藏綁定主鍵
    }
}

3. 點擊更新

private void lbStudents_SelectedIndexChanged(object sender, EventArgs e) {
    if (lbStudents.SelectedValue == null) return; // 防止綁定時觸發
    
    int stuId = Convert.ToInt32(lbStudents.SelectedValue);
    string connStr = "Server=.;Database=School;Uid=sa;Pwd=123;";
    string sql = "UPDATE Students SET StuSelect = 1 WHERE StuId = @id";
    
    using (SqlConnection conn = new SqlConnection(connStr))
    using (SqlCommand cmd = new SqlCommand(sql, conn)) {
        cmd.Parameters.AddWithValue("@id", stuId); // 參數化防注入
        conn.Open();
        int rows = cmd.ExecuteNonQuery();
        if (rows > 0) 
            MessageBox.Show($"學生 {lbStudents.Text} 已標記選中");
    }
}

進階優化

痛點優化方案
頻繁開關連接使用連接池(默認開啟),或單例 SqlConnection 配合 using 確保釋放
UI 凍結異步 await cmd.ExecuteNonQueryAsync() + Task.Run 包裹
並發衝突加樂觀鎖 WHERE StuId=@id AND StuSelect=0,rows==0 提示「已被他人選中」
硬編碼連接串移至 app.config connectionStrings 節點,ConfigurationManager.ConnectionStrings["SchoolDB"].ConnectionString 讀取

常見坑點

  • 未設置 ValueMember:SelectedValue 為 DataRowView,需 ((DataRowView)lbStudents.SelectedItem)["StuId"] 取值,易出錯。
  • 綁定時觸發事件:SelectedIndexChanged 在 DataSource 賦值時也會觸發,務必加 if (lbStudents.SelectedValue == null) return; 守衛。
  • 拼接 SQL:"UPDATE ... WHERE StuId=" + stuId 極度危險,**永遠用參數化**。

總結

核心模式:ListBox 綁定 DataTable + ValueMember 綁主鍵 + SelectedIndexChanged 取值 + 參數化 UPDATE。掌握此模式,WinForm 數據交互場景通殺。

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