【问题标题】:Store multiple ListBox selections in database?在数据库中存储多个列表框选择?
【发布时间】:2010-12-09 20:04:28
【问题描述】:

我有一个名为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”列中。有人对如何修复此代码有任何建议吗?提前致谢。

【问题讨论】:

  • 这些答案是否解决了您的问题?如果是这样,请选择该选项作为“正确”。如果没有,请编辑您的问题和/或添加 cmets 以更好地阐明您的目标,以便您获得更好的答案。

标签: c# sql visual-studio listbox


【解决方案1】:

要解决的问题:

  1. 在做任何事情之前,参数化你的 sql。注射的时机已经成熟。Tutorial here
  2. 您没有处理您的 cmd 或连接字符串。将它们包装在 Using 子句中。 Example here
  3. 对项目执行一次 foreach 以查看哪些项目被选中。要么将它们存储在数据库中的逗号分隔列表中(需要在返回时进行解析),要么将它们存储在自己的表中。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      首先,您应该使用参数化查询而不是直接连接来防止 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();
      };
      

      【讨论】:

        【解决方案4】:

        尝试获取类似的选定项目:

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

        【讨论】:

        • 我认为在这种情况下使用 StringBuilder 并附加到它会更有效,而不是为每个项目创建新字符串。
        猜你喜欢
        • 2019-02-26
        • 2010-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-21
        • 1970-01-01
        • 2019-08-13
        • 1970-01-01
        相关资源
        最近更新 更多