项目列在列表框中,我想使用 foreach 从 SQL 中删除项目

Items are listed in listbox, I want to use foreach to delete the items from SQL

private void SearchTable()
        {
            try
            {
                    using (SqlConnection con = new SqlConnection("Data Source=localhost\SQLEXPRESS;Initial Catalog=Steripack;Integrated Security=True"))
                    {
                        foreach (var item in lstCompleted.Items)
                        {
                        string killtag = item.ToString();
                        con.Open();
                        using (SqlCommand command = new SqlCommand("DELETE FROM tblAsset1 WHERE tagID = " + killtag))
                        {
                            command.ExecuteNonQuery();
                            lstCompleted.Items.Add("Removed: " + killtag);
                        }
                        con.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                lblStatus.Text = "SQL Failed..." + ex;
            } 
        }

首先,使用 sql 参数而不是字符串连接。否则你将接受 sql-注入。您还必须将连接分配给命令。

但是,这里还有另一个问题:您正在修改您在 foreach 中枚举的集合。

一种方法:使用另一个集合来存储稍后添加的项目:

using (SqlConnection con = new SqlConnection("Data Source=localhost\SQLEXPRESS;Initial Catalog=Steripack;Integrated Security=True"))
{
    List<string> deletedMessages = new List<string>();
    foreach (object item in lstCompleted.Items)
    {
        int killtag = int.Parse(item.ToString());
        con.Open();
        using (SqlCommand command = new SqlCommand("DELETE FROM tblAsset1 WHERE tagID = @killtag", con))
        {
            command.Parameters.Add(new SqlParameter("@killtag", SqlDbType.Int).Value = killtag);
            command.ExecuteNonQuery();
            deletedMessages.Add("Removed: " + killtag);
        }
        //con.Close(); // unnecessary with using
    }
    foreach (string deletedMsg in deletedMessages)
        lstCompleted.Items.Add(deletedMsg);
}

另一种方法是将要删除的项目存储在您在 foreach 中枚举的另一个集合中:

List<string> toDelete = lstCompleted.Items.Cast<string>().ToList();
foreach (string item in toDelete)
{
    int killtag = int.Parse(item);
    con.Open();
    using (SqlCommand command = new SqlCommand("DELETE FROM tblAsset1 WHERE tagID = @killtag", con))
    {
        command.Parameters.Add(new SqlParameter("@killtag", SqlDbType.Int).Value = killtag);
        command.ExecuteNonQuery();
        lstCompleted.Items.Add("Removed: " + killtag);
    }
}

请注意,第一行中的 .ToList() 是必不可少的,因为它创建了一个不同的、不关联的列表,它不引用 Listbox.Items 中的 ObjectCollection

看起来您还没有为您的连接分配 sqlcommand 对象

SqlCommand("DELETE FROM tblAsset1 WHERE tagID = " + killtag, Con)