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