Newcodervb Ответов: 2

ГАДЮКА. NET (VB) - как вставить несколько значений checkboxlist в SQL server?


Я создал форму в ASP. Net (VB) с 4-мя однострочными учебниками и одним списком флажков.
С помощью кода, который я пробовал, в базу данных вставляется только одно значение. Я хочу, чтобы было вставлено несколько значений. Я действительно не знаю, как получить несколько выбранных флажков, вставленных в базу данных. Пожалуйста, нужна помощь, я был бы признателен, если бы я мог увидеть пример.
Спасибо

Что я уже пробовал:

Зубрить. ConnectionString="DataSouce=.... Безопасность=True"
Зубрить. Открыть()
Cmd= new SqlCommand("вставить в таблицу значения(' " & Text1.Текст &ампер; " ',' " &амп; Текст2.Текст &ампер;" ', '" &амп; Текст3.Текст &ампер; " ', '" &амп; Надпись4.Текст & " ',, '" & CheckBoxList. Текст & " ') ", кон)
УМК. Метод executenonquery()
Зубрить. Закрывать()

MadMyche

Вы пытаетесь вставить несколько ролей; 1 строка для каждого значения флажка?

2 Ответов

Рейтинг:
19

Garth J Lancaster

Я бы подумал, что вам нужно будет создать массив из вашего (ненулевого) TextBox values, loop though that, и запустите insert sql, но это большое предположение, учитывая, что вы не поместили объявление таблицы (это один столбец, несколько ... ?)

кстати, пожалуйста, не создавайте sql таким образом - посмотрите параметризованный sql-запрос, например

Dim textValues(4) as String
' Populate textValues with non-null Text[n].Text values giving number of elements in numText

Dim sql As String = "Insert into table values(@textBoxValue)"

For ctr As Integer = 0 To numText-1
    Using Con As New SqlConnection("DataSource=.... Security=True"), _
        cmd As New SqlCommand(sql, Con)

        cmd.Parameters.Add("@textBoxValue", SqlDbType.VarChar, 50).Value = textValues(ctr)
        cmd.ExecuteNonQuery()
    End Using
Next


Это довольно неэффективно, поскольку он создает и избавляется от соединения numText times, но по крайней мере это идея шоу

отказ от ответственности : я не писал VB с тех пор, как у меня были волосы, думаю, 30+ лет, так что получите "идею" от того, что я положил, а не точный код - вы, вероятно, могли бы перестроить цикл using/for, чтобы получить

Using Con As New SqlConnection("DataSource=.... Security=True"), _
        cmd As New SqlCommand(sql, Con)

    For ctr As Integer = 0 To numText-1
        cmd.Parameters.Add("@textBoxValue", SqlDbType.VarChar, 50).Value = textValues(ctr)
        cmd.ExecuteNonQuery()
        cmd.Parameters.Clear() ' Assumption - this is a valid method/call 
    Next 
End Using


или что-то подобное

[edit] первая часть проблемы может начинаться так

' Loop through ALL textboxes on form adding non-null values to textValues Array and increasing numText Count 
Dim ctrl As Control
numText = 0
For Each ctrl In Me.Controls
   If (ctrl.GetType.ToString = "System.Windows.Forms.TextBox") Then
        String.IsNullOrEmpty(strTest) Then 
            textValues(numText) = CType(ctrl, TextBox).Text
            numText += 1
        End If
   End If
Next


Но опять же, это идея - я даже не могу вспомнить, начинаются ли индексы массива VB с 0 или 1 !

[/Редактировать]


Maciej Los

"Я даже не могу вспомнить, начинаются ли индексы массива VB с 0 или 1"
В .Net - начинается с нуля (опция Base switch была удалена)!
В VB, VBA - depeneds on switch Option Base 0|1

Garth J Lancaster

ура Мацей - я мог бы посмотреть его, но не хотел делать ВСЮ работу плаката

Maciej Los

Привет, Гарт!
Я поторопился, извини ;)
Кстати: +5!

Рейтинг:
10

MadMyche

Вы когда-нибудь слышали о SQL-инъекция, которая уже более 20 лет входит в топ-10 уязвимостей приложений? Ваш код восприимчив к нему; вы должны NEVER EVER создайте запрос, объединив команды SQL с пользовательским вводом.

Правильный способ поместить пользовательский ввод в SQL-запрос-это использовать Параметры[^]. В .NET Framework это коллекция, которая является одним из свойств элемента command.
Помимо устранения рисков безопасности, он также заботится о типах данных, так что вам не нужно будет заключать текст в одинарные кавычки и т. д. Код также выглядит намного чище.

Вот как может выглядеть ваш код при его реализации

Con.ConnectionString="DataSouce=.... Security=True"
Con.Open()

Cmd= new SqlCommand("Insert into table values (@T1, @T2, @T3, @T4, @CB1) ", con)
Cmd.Parameters.AddWithValue("@T1", Text1.Text)
Cmd.Parameters.AddWithValue("@T2", Text2.Text)
Cmd.Parameters.AddWithValue("@T3", Text3.Text)
Cmd.Parameters.AddWithValue("@T4", Text4.Text)
Cmd.Parameters.AddWithValue("@CB1", CheckBoxList.Text)

Cmd.ExecuteNonQuery()
Con.Close()
Ссылка: MS Docs : SqlParameterCollection.Метод AddWithValue(String, Object) [^]

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

Если вы используете более новую версию SQL Server, то существует табличная функция, называемая STRING_SPLIT()[^] который вернет таблицу, разбив очерченные значения на строки
Если ваш флажок возвращая список, очерченный запятыми, вы можете просто заменить его INSERT команда с этой строкой T-SQL
INSERT into Table
SELECT @T1, @T2, @T3, @T4, value
FROM   STRING_SPLIT(@CB1, ',')
Ссылка: MS Docs: STRING_SPLIT (Transact-SQL)[^]


MadMyche

Что вставляется в 5-й(?) столбец для значения флажка?