Как эффективно удалить данные из нескольких таблиц
У меня есть 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
Я изменил свой код, теперь я включил параметризованный оператор. Пожалуйста, ознакомьтесь с приведенным выше кодом. Однако я не понимаю плана кэшированных запросов. Можете ли вы привести мне пример?