在数据库中存储多个ListBox选择?

时间:2010-12-09 20:04:29

标签: c# sql visual-studio listbox

我有一个名为listbox的ListBox。其“多选”属性设置为true。我需要将此ListBox中的选择存储到数据库字段中。

请注意,我使用的是Web表单,ASP.NET,C#和Visual Studio Web Developer 2010 Express。

我的代码如下:

SqlCommand insertNL = new SqlCommand("insert into dbo.newsletter (newsletter_subject,newsletter_body,newsletter_sentto) VALUES ('" + TextBox1.Text + "', '" + TextBox2.Text + "', '" + ListBox1.SelectedItem + "')", badersql);
        badersql.Open();
        insertNL.ExecuteNonQuery();
        badersql.Close();

不幸的是,此代码仅将ListBox的第一个选定值存储在newsletter_sentto表的“newsletter”列中。有没有人有任何关于如何修复此代码的建议?提前谢谢。

4 个答案:

答案 0 :(得分:3)

要解决的问题:

  1. 在执行任何其他操作之前,请参数化您的sql。注射成熟。 Tutorial here
  2. 您没有丢弃cmd或连接字符串。将这些包含在Using子句中。 Example here
  3. 对项目执行foreach以查看选择了哪些项目。将它们存储在数据库中的逗号分隔列表中(需要在退回的路上解析)或将它们存储在自己的表中。

答案 1 :(得分:2)

您需要先决定如何存储多个“newsletter_sentto”值。

  • 您最好的解决方案是创建一个新的子表,其中每个所选项目有1行和一列,外键返回到您的简报表。

  • 您可以尝试将它们一起存储在一行中,其中包含多个列(sentto1,sentto2等),这将限制您可以存储的最大值数,并且会导致在多个字段中搜索时出现问题。您如何查询发送给特定人的内容? WHERE sentto1=@user or sentto2=@user...没有索引可以在那里使用。

  • 您可以使用“,”或“;”将所有值填入单行和列中分开价值观。这会导致很多问题,因为每次你需要获得一个sentto值时,你必须不断拆分字符串。

答案 2 :(得分:2)

首先,您应该使用参数化查询而不是直接连接来防止SQL注入。其次,您需要遍历所选项目并构建(可能)选择的分隔列表。

var selectedItems = new List<string>();
foreach( var item in ListBox1.SelectedItems )
    selectedItems.Add( item.ToString() );

var sql = "Insert dbo.newsletter(newsletter_subject,newsletter_body,newsletter_sentto)"
    + " Values(@newsletter_subject, @newsletter_body, @newsletter_sentto)"

badersql.Open();
using ( qlCommand = new SqlCommand(sql, badersql) )
{
    qlCommand.Parameters.AddWithValue("@newsletter_subject", TextBox1.Text);
    qlCommand.Parameters.AddWithValue("@newsletter_body", TextBox2.Text);
    qlCommand.Parameters.AddWithValue("@newsletter_sentto", string.Join(',', selectedItems.ToArray()));
    qlCommand.ExecuteNonQuery();
};

答案 3 :(得分:1)

尝试获取这样的选定项目:

string newsletterSentTo = "";
foreach (ListItem item in ListBox1.Items)
{
    if (item.Selected)
        newsletterSentTo += "," + item.Text;
}