Как я могу взять каждый элемент массива и вставить его в базу данных SQL?

У меня есть следующий код vb.net для извлечения значений из текстового поля на веб-странице (на самом деле тегов с разделителями пробелами) и разделения их с разделителем пробела в массив. Это работает именно так, как я хочу.

mySample.Tags = tagsTextBox.Text
Dim tags As String = mySample.Tags
Dim tagarray() As String
Dim count As Integer
tagarray = tags.Split(" ")
For count = 0 To tagarray.Length - 1
Next

Моя проблема в том, что я не знаю, как взять каждое из значений в массиве после запуска этого кода, чтобы вставить их как отдельные записи в таблицу.

Я также не буду знать, сколько элементов будет в массиве.


person Cunners    schedule 18.02.2009    source источник


Ответы (2)


Как сказал Ян, это может быть уязвимо для инъекций Sql. По крайней мере, вы должны сделать Server.HtmlEncode () для каждого тега, который хотите вставить.

Чтобы вставить свои данные, вы можете сделать следующее:

using (SqlConncetion conn = new SqlConnection(connstring))
using (SqlCommand cmd = conn.CreateCommand())
{

  cmd.CommandText = "INSERT INTO table(tag) values (@tag)";
  cmd.Parameters.Add("@tag", SqlDbType.VarChar);

  conn.Open();

  foreach(string tag in tags)
  {
    cmd.Parameters["@tag"].Value = Server.HtmlEncode(tag);
    cmd.ExecuteNonQuery();
  }
}

Это должно работать правильно, но делать это в хранимой процедуре, и вы должны быть защищены от инъекций sql, поскольку вы используете параметры.

Также вы должны увидеть здесь, где обсуждается использование параметры.

person Rune Grimstad    schedule 18.02.2009
comment
Проблема с этим методом заключается в том, что его круговой обход является центральным и довольно часто требуется временная таблица. Он может быть довольно хрупким. Если учесть это, то обычно лучше передать список. - person Sam Saffron; 18.02.2009
comment
что может быть прекрасно в зависимости от обстоятельств - person Sam Saffron; 18.02.2009
comment
@ck просто устанавливает значение коляски, которое обрабатывает материал для инъекций, htmlencode в любом случае здесь действительно не нужен - person Sam Saffron; 18.02.2009
comment
HtmlEncode не останавливает SQL-инъекции, но он остановит многие другие, например атаки межсайтового скриптинга. Использование параметра остановит любые SQL-инъекции. - person Rune Grimstad; 18.02.2009
comment
Но я согласен с sambo99, что делать это в базе данных - лучший вариант - person Rune Grimstad; 18.02.2009

Все зависит от требований к производительности и общих практик, которые вы используете. Ответ Руны может быть прекрасным. Если вы вставляете 100 000 строк, обратите внимание на средство массовой вставки.

Если вы привыкли писать хранимые процессы и вам посчастливилось запустить SQL 2008, вы можете использовать параметры со значениями таблицы

Это позволяет делать такие вещи:

SqlCommand cmd = new SqlCommand("usp_ins_Portfolio", conn);
cmd.CommandType = CommandType.StoredProcedure;
//add the ds here as a tvp
SqlParameter sp = cmd.Parameters.AddWithValue("@Portfolio", ds.Tables[0]);
//notice structured
sp.SqlDbType = SqlDbType.Structured;
cmd.ExecuteNonQuery();

Затем один вызов сохраненной процедуры может вставить все необходимые строки в таблицу тегов.

Для SQL 2005 и ниже я обычно использую один параметр, разделенный запятыми, для всех значений и разделяю его в TSQL внутри сохраненной процедуры. Это имеет тенденцию работать довольно хорошо и позволяет избежать возни с временными таблицами. Это также безопасно, но вы должны убедиться, что используете параметр ввода текста для процедуры или имеете какой-то лимит или механизм пакетной обработки в коде (чтобы вы не усекали длинные списки).

Идеи о том, как разделить списки в TSQL, можно найти в отличной статье Эрланда < / а>.

Версия для Sql 2000 находится здесь.

person Sam Saffron    schedule 18.02.2009