Как я могу взять каждый элемент массива и вставить в базу данных SQL? - PullRequest
0 голосов
/ 18 февраля 2009

У меня есть следующий код 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

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

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

Ответы [ 2 ]

1 голос
/ 18 февраля 2009

Как сказал Ян, это может быть уязвимым для инъекций 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-инъекций, поскольку вы используете параметры.

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

0 голосов
/ 18 февраля 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 версия статьи здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...