从数据库中删除列表框中的现有项目

时间:2018-02-12 16:36:43

标签: c# sql listbox

我正在尝试删除列表框中已存在于我的数据库中的项目。我的列表框由一组随机名称填充,并且应删除与表行中的数据相等的名称。 我的代码:

        SqlCommand RemoveUserName = new SqlCommand("SELECT * FROM Name WHERE ([Name] = @check)", Con);
        RemoveUserName.Parameters.AddWithValue("@check", listbox1.Items);
        SqlDataReader dr = RemoveUserName.ExecuteReader();
        if (dr.HasRows)
        {
            listBox1.Items.Remove(); // ?? Remove the names which are already in the database

        }
        else
        {
          // remain in listbox
        }

我的参数值出错并且我不知道如何删除所述项目。

编辑我当前的代码:

    SqlCommand RemoveUserName = new SqlCommand("SELECT * FROM Name", Con);
    SqlDataReader dr = RemoveUserName.ExecuteReader();
        while (!dr.Read())
        {
            for (int i = 0; i < listBox1.Items.Count; ++i)
            {
                if (listBox1.Items[i].ToString() == dr["Name"].ToString())
                    listBox1.Items.Remove(listBox1.Items[i]);
            }
        }

不再有任何错误,但仍无效。

工作代码:

          for (int i = listBox1.Items.Count - 1; i >= 0; --i)
        {
            using (var cmd = new SqlCommand("UPDATE [Name] SET [Name] = Name WHERE [Name] = @name", Con))
            {
                cmd.Parameters.AddWithValue("@name", listBox1.Items[i].ToString());
                if (cmd.ExecuteNonQuery() > 0)
                {
                    listBox1.Items.RemoveAt(i);
                }
          }
        }

谢谢@ LarsTech

3 个答案:

答案 0 :(得分:0)

有助于在列表中向后循环以避免索引问题:

for (int i = listBox1.Items.Count - 1; i >= 0; --i) {
  using (var cmd = new SqlCommand("DELETE FROM [Name] WHERE [Name] = @name", Con)) {
    cmd.Parameters.AddWithValue("@name", listBox1.Items[i].ToString());
    if (cmd.ExecuteNonQuery() > 0) {
      listBox1.Items.RemoveAt(i);
    }
  }
}

ExecuteNonQuery将返回受影响的记录数,因此如果它大于零,则会找到并删除该名称。

确保也关闭连接对象。最好将它也放在一个使用块中,就像我的例子中的SqlCommand对象一样。

您的表名和列名需要改进。

答案 1 :(得分:0)

据我了解,

1)您需要从数据库中已存在并由SqlDataReader读取的列表框中删除项目。

首先需要循环阅读器。因此,而不是!while(reader.Read())使用while(reader.Read())

2)现在您要从列表框中删除实际项目(如果它存在于阅读器中)。

因此,请尝试执行以下操作,从listbox reader循环

中删除while
for (int n = listBox.Items.Count - 1; n >= 0; --n)
  {
    var removelistitem = dr["Name"].ToString();
    if (listBox.Items[n].ToString().Contains(removelistitem))
      {
        listBox.Items.RemoveAt(n);
      }
  }

现在执行while循环后。您的列表框将只包含您的阅读器中没有的项目(来自数据库的数据)。

希望这会有所帮助。

修改

可以在列表框项中循环。

请改用RemoveAt。 (见上面的答案)

答案 2 :(得分:-1)

试试这个:

    while (!dr.Read())
    {
        for (int i=0; i<listBox1.Items.Count; ++i)
        {
            if (listBox1.Items[i].ToString() == dr["columnName"].ToString())
                listBox1.Items.Remove(listBox1.Items[i]);
        }
    }
使用前必须阅读

SqlReader。如果Reader中没有行,while块中的代码将无法执行。

编辑我遇到了让你不开心的问题......

您提供的代码:

RemoveUserName.Parameters.AddWithValue("@check", listbox1.Items);

错误,因为@check参数需要string,但您提供的是ObjectCollection。将查询"SELECT * FROM Name WHERE ([Name] = @check)"修改为"SELECT * FROM Name"。并删除行AddWithValue