[英]Remove existing items in listbox from database
我正在嘗試刪除列表框中的項目,該項目已存在於我的數據庫中。 我的列表框由一組隨機名稱填充,應刪除與表行中的數據相等的名稱。 我的代碼:
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
它有助於在列表中向后循環以避免索引問題:
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 將返回受影響的記錄數,因此如果它大於零,則該名稱已被找到並被刪除。
確保也關閉您的連接對象。 最好將它也放在 using 塊中,就像我的示例中的 SqlCommand 對象一樣。
您的表名和列名需要改進。
據我了解,
1) 您需要從數據庫中已存在的列表框中刪除項目並由 SqlDataReader 讀取。
您首先需要循環到閱讀器中。 所以,而不是! while(reader.Read())
使用while(reader.Read())
2)現在您想從列表框中刪除實際項目,如果它存在於閱讀器中。
因此,請嘗試執行以下操作以while
循環時從reader
內的listbox
刪除項目
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。 (見上面的回答)
嘗試這個:
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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.