Member 11856456 Ответов: 1

Как эффективно удалить данные из нескольких таблиц


У меня есть 5 таблиц, из которых я сейчас удаляю. Вот как они все настроены:

For Each dgvr As DataGridViewRow In DataGridView1.SelectedRows
 Using sqlcon As New SqlConnection(connectionstring + ComboBox1.Text + ".mdf;Integrated Security=True")
                    Try
                       sqlcon.Open()
                        Dim Sources As String = "Delete from " + "[Profile]" + " where Id = @ID"

                        Dim cmd As SqlClient.SqlCommand
                        cmd = New SqlClient.SqlCommand(Sources, sqlcon)
                        cmd.Parameters.AddWithValue("@ID", dgvr.Cells(0).Value.ToString)

                        cmd.ExecuteNonQuery()

                        sqlcon.Close()

                    Catch ex As Exception

                    End Try

                End Using
Next


Единственное отличие при удалении из других таблиц заключается в том, что ID-это individual_ID, но это ссылка на исходный ID. Однако, я по-прежнему использовать dgvr.Ячейки(0).Значение.Метод toString

Я попробовал удалить партию из примерно 8000 человек, и на удаление такой маленькой партии уходит около 20 минут.

есть предложения?

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

Я пытался использовать оператор join, однако, когда я пытался запустить код, оператор никогда не срабатывал. Итак, я предположил, что либо утверждение было неверным, либо vb.net ему трудно понять код соединения.

Richard Deeming

Ваш код таков потенциально уязвимы для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

Richard Deeming

Есть ли у вас внешние ключи, установленные на столах с помощью ON DELETE CASCADE сет?

Member 11856456

У меня нет внешних ключей, установленных на любом столе, главным образом потому, что люди должны работать вокруг них. Смогут ли люди по-прежнему использовать SQL-инъекцию, поскольку код требует выбора строк и ничего не вводится?

Richard Deeming

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

Но это хорошая привычка всегда использовать параметры в любом случае. Это может помочь с производительностью - SQL может повторно использовать кэшированный план запроса, а не создавать новый план запроса для каждого другого значения. И вы избежите уязвимостей в будущем, если предположения изменятся, но вы забудете соответствующим образом обновить код. :)

Member 11856456

Я изменил свой код, теперь я включил параметризованный оператор. Пожалуйста, ознакомьтесь с приведенным выше кодом. Однако я не понимаю плана кэшированных запросов. Можете ли вы привести мне пример?

1 Ответов

Рейтинг:
0

Emmerel

Помимо очевидных уязвимостей безопасности в вашем коде, в вашем цикле просто создайте строку всех пользователей, разделенных запятой (например, "Билл", "Джейн", "Том"). Затем запустите запрос, но изменить ", где ID=" "где ID в (" + удостоверение + ")". Таким образом, запрос выполняется только один раз.

Но опять же, и как уже говорили другие, вы открываете себя для атаки SQL-инъекций.