問題程式碼
string strSQL = "delete from GrindingWheelInformation where listView1.SelectedItems[0]'" + listView1.SelectedItems.ToString() + "'";
listView1.Items.Remove(listView1.SelectedItems[0]);
// 缺少:連線開啟、命令執行、參數化、錯誤處理
錯誤分析
- SQL 語法錯誤:
where listView1.SelectedItems[0]' 非合法欄位名,字串拼接導致注入風險。
- 未執行 SQL:僅建立字串,未呼叫
OleDbCommand.ExecuteNonQuery()。
- 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 需隱藏或顯示主鍵欄位,以便刪除時精確定位。