Хранить несколько выборов ListBox в базе данных? - PullRequest
0 голосов
/ 09 декабря 2010

У меня есть ListBox с именем listbox.Его свойство «множественный выбор» установлено на true.Мне нужно сохранить выборы из этого ListBox в поле базы данных.

Обратите внимание, что я использую веб-формы, 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 ]

3 голосов
/ 09 декабря 2010

Что нужно исправить:

  1. Прежде чем делать что-либо еще, настройте параметры SQL.Это готово для инъекций. Учебник здесь .
  2. Вы не утилизируете свой cmd или строку подключения.Оберните их в предложениях Using. Пример здесь .
  3. Выполните foreach для элементов, чтобы увидеть, какие из них выбраны.Либо сохраните их в списке через запятую в базе данных (который требует анализа на обратном пути), либо сохраните их в собственной таблице.
2 голосов
/ 09 декабря 2010

Во-первых, вы должны использовать параметризованные запросы вместо прямой конкатенации для защиты от внедрения 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();
};
2 голосов
/ 09 декабря 2010

Вам нужно сначала решить, как вы хотите сохранить несколько значений "newsletter_sentto".

  • Лучшее решение - создать новую дочернюю таблицу, в которой у вас есть 1 строка и столбец на выбранный элемент, с внешним ключом, возвращаемым к вашей таблице новостной рассылки.

  • Вы можете попытаться сохранить их все вместе в одной строке с несколькими столбцами (sentto1, sentto2 и т. Д.), Это ограничит максимальное количество значений, которое вы можете сохранить, и вызовет проблемы при поиске по нескольким полям.Как вы будете запрашивать, что было отправлено конкретному человеку?WHERE sentto1=@user or sentto2=@user... там нельзя использовать индекс.

  • Вы можете поместить все значения в одну строку и столбец, используя "," или ";"разделить значения.это вызовет много проблем, потому что вам придется постоянно разбивать строку, каждый раз, когда вам нужно получить одно из значений sentto.

1 голос
/ 09 декабря 2010

Попробуйте получить выбранные предметы, как это:

string newsletterSentTo = "";
foreach (ListItem item in ListBox1.Items)
{
    if (item.Selected)
        newsletterSentTo += "," + item.Text;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...