Member 11856456 Ответов: 2

Добавление строки в соответствие с добавленными значениями SQL


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

Dim cb2 As New StringBuilder("INSERT INTO ")
               cb2.AppendFormat("[" + Form1.TreeView1.SelectedNode.Text.ToString + "]" + " values(@")
               Dim sbOn As New StringBuilder(" @ ")
               Dim andRequired As Boolean = False

               For Each item In Form1.DataGridView1.Columns
                   If andRequired Then
                       sbOn.Append(" , ")
                   End If
                   Dim columnName As String = item.ToString()
                   sbOn.AppendFormat("@", columnName)
                   andRequired = True

               Next


строка должна выглядеть так:

insert into " + "[" + Form1.TreeView1.SelectedNode.Text.ToString + "]" + "values(@ID,@First,@Last,@Middle,@age)


Я ценю вашу помощь.

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

Я использую
MessageBox.Show(cb2.ToString)
чтобы помочь мне понять, где я нахожусь в этой цепочке. На данный момент я не могу произвести струну так, как мне нужно, чтобы она вышла.

2 Ответов

Рейтинг:
9

CHill60

Вы не слишком далеко ушли, но вы должны обратить внимание на комментарии ppolymorphe о SQL-инъекции.

Чтобы получить строку в правильном формате, попробуйте сделать следующее: [br теги, показывающие ошибку сайта, которая будет исправлена в ближайшее время]

      Dim cb2 As New StringBuilder("INSERT INTO [@table] VALUES (")<br />
        <br />
        Dim commaRequired As Boolean = False<br />
<br />
        For Each item As DataGridViewColumn In Me.DataGridView1.Columns<br />
            If commaRequired Then<br />
                cb2.Append(" , ")<br />
            End If<br />
            cb2.AppendFormat("@{0}", item.Name)<br />
            commaRequired = True<br />
        Next<br />
<br />
        cb2.Append(")")

Ваша следующая проблема заключается в том, как получить все эти значения в параметры SQL для того, как вы собираетесь вставить эту информацию в базу данных. Если я предположу, что фактические значения находятся в строке 0 DataGridView, то что-то вроде этого может сработать
        Dim cb2 As New StringBuilder("INSERT INTO [@table] VALUES (")<br />
        Dim sqlcmd As New SqlCommand()<br />
        sqlcmd.Connection = conn<br />
        sqlcmd.Parameters.AddWithValue("@table", Me.TreeView1.SelectedNode.Text.ToString())<br />
<br />
        Dim commaRequired As Boolean = False<br />
<br />
        For Each item As DataGridViewColumn In Me.DataGridView1.Columns<br />
            If commaRequired Then<br />
                cb2.Append(" , ")<br />
            End If<br />
            Dim parmName As String = String.Format("@{0}", item.Name)<br />
            cb2.Append(parmName)<br />
            sqlcmd.Parameters.AddWithValue(parmName, Me.DataGridView1.Rows(0).Cells(item.Name).Value)<br />
            commaRequired = True<br />
        Next<br />
<br />
        cb2.Append(")")<br />
        sqlcmd.CommandText = cb2.ToString()

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


Рейтинг:
17

Patrice T

Никогда не создавайте SQL-запрос путем конкатенации с пользовательскими вводами, он называется "SQL-инъекция", он опасен для вашей базы данных и подвержен ошибкам.
Одна кавычка в имени - и ваша программа рухнет. Если пользовательский ввод типа "Брайан О'Коннер" может привести к сбою вашего приложения, то это уязвимость SQL-инъекции.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]