2010-12-09 91 views
0

我有一个名为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(); 

不幸的是,这个代码只存储在我的newsletter表的“newsletter_sentto”列ListBox的第一选择的值。有没有人有任何建议如何解决这个代码?提前致谢。

+1

这些答案都没有解决您的问题吗?如果是这样,请选择那个“正确”。如果没有,编辑你的问题和/或添加评论,以更好地阐明你的后,你可以得到更好的答案。 – 2010-12-15 20:31:04

回答

1

试图获得所选项目那样:

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

我认为在这种情况下使用StringBuilder并追加到它会更有效,而不是为每个项目创建新的字符串。 – EndlessSpace 2010-12-09 20:15:35

2

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

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

  • 您可以尝试将它们全部一起存储在一行中,包含多列(sentto1,sentto2等),这会限制您可以存储的值的最大数量,并且会导致跨多个字段搜索的问题。你将如何查询发送给某个人的内容? WHERE [email protected] or [email protected]没有索引可以在那里使用。

  • 您可以使用“,”或“;”将所有值填入单行和列中。分开这些值。这会造成很多问题,因为每次需要获取其中一个值时,您必须不断分割字符串。

2

事情来解决:

  1. 之前做别的事情,你的参数化SQL。这是注射成熟。Tutorial here
  2. 您不会处置您的cmd或连接字符串。将这些包裹在Using子句中。 Example here
  3. 对项目执行foreach查看哪些项目被选中。将它们存储在数据库中的逗号分隔列表中(需要在返回时解析)或将它们存储在自己的表中。
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(); 
}; 
相关问题