簡體   English   中英

從數據庫中刪除列表框中的現有項目

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM