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

C# ListView 刪除選中行但資料庫未同步刪除:SQL 參數化與執行檢查

     編輯:程式設計綜合問答

問題程式碼

string strSQL = "delete from GrindingWheelInformation where listView1.SelectedItems[0]'" + listView1.SelectedItems.ToString() + "'";
listView1.Items.Remove(listView1.SelectedItems[0]);
// 缺少:連線開啟、命令執行、參數化、錯誤處理

錯誤分析

  1. SQL 語法錯誤:where listView1.SelectedItems[0]' 非合法欄位名,字串拼接導致注入風險。
  2. 未執行 SQL:僅建立字串,未呼叫 OleDbCommand.ExecuteNonQuery()。
  3. ToString() 非預期值:ListView.SelectedListViewItemCollection.ToString() 回傳型別名稱,非項目內容。

正確實作

private void DeleteSelected()
{
    if (listView1.SelectedItems.Count == 0) return;
    var item = listView1.SelectedItems[0];
    string id = item.SubItems[0].Text; // 假設第 0 欄為主鍵 ID

    string connStr = @"Provider=Microsoft.Jet.OleDb.4.0;Data Source=D:\Data\GEARCNC.mdb";
    string sql = "DELETE FROM GrindingWheelInformation WHERE ID = @ID";

    using (var conn = new OleDbConnection(connStr))
    using (var cmd = new OleDbCommand(sql, conn))
    {
        cmd.Parameters.AddWithValue("@ID", id);
        try
        {
            conn.Open();
            int rows = cmd.ExecuteNonQuery();
            if (rows > 0)
            {
                listView1.Items.Remove(item); // 資料庫刪除成功再移除 UI
                MessageBox.Show("刪除成功");
            }
            else
            {
                MessageBox.Show("找不到對應資料");
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("刪除失敗:" + ex.Message);
        }
    }
}

關鍵點

  • 參數化查詢:防 SQL 注入、處理型別轉換。
  • using 區塊:確保連線、命令正確釋放。
  • UI 與資料同步:資料庫操作成功後再更新 UI。
  • 主鍵識別:ListView 需隱藏或顯示主鍵欄位,以便刪除時精確定位。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved