Member 11856456 Ответов: 1

Как сделать функцию удаления в VB.NET использование SQL


Короче говоря, я хочу сделать функцию SQL delete либо по порядковому местоположению, либо по gridview.selectedrow. Я пытался и не раз терпел неудачу. Я прошу помощи в решении этого вопроса.

Private Sub Single_delete()
        Try

            Dim sqlcon As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=c:\users\jj\documents\visual studio 2015\Projects\WindowsApplication3\WindowsApplication3\Database1.mdf;Integrated Security=True")
            Dim sqladapt = New SqlDataAdapter("Select * from " + "[" + TreeView1.SelectedNode.Text.ToString, sqlcon)

            sqlcon.Open()
            Dim cmd As SqlClient.SqlCommand
            Dim sql As String = "Delete from " + "[" + TreeView1.SelectedNode.Text.ToString + "]" + " where Id= " + Database1DataSet.Tables(TreeView1.SelectedNode.ToString).Columns("Id").Ordinal.ToString
            cmd = New SqlClient.SqlCommand(sql, sqlcon)

            cmd.Parameters.AddWithValue("@id", Database1DataSet.Tables(TreeView1.SelectedNode.ToString).Columns("Id").Ordinal.ToString)

            cmd.ExecuteNonQuery()
            sqlcon.Close()

            MessageBox.Show("Record deleted")
        Catch ex As Exception
            MsgBox(ex.Message)

        End Try

    End Sub


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

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

Я попытался переключиться между порядковыми номерами, используя столбец "ID" в качестве источника текста, а также попытался сделать выбранное удаление сетки. Когда я сделал выбранное удаление gridrow, появилось сообщение, в котором говорилось, что запись удалена, но ни одна запись не была удалена из базы данных.

[no name]

Вы получаете "запись удалена", потому что вы не проверяете, была ли запись на самом деле удалена или нет, поэтому она будет отображаться каждый раз.
Зачем вам преобразовывать объект, который уже является строкой, в строку? Какой цели это служит?
Почему вы создаете параметр, а затем не используете его в своем запросе?
Почему вы создаете только один параметр, а не 2, как должно быть?

Member 11856456

Если я не изменю его в строку, то получу сообщение об ошибке "преобразование из строки" delete from [table2] where Id = "to type' Double ' is not valid"

предполагается, что мой параметр равен числу в столбце ID.

не уверен, что вы подразумеваете под созданием 2 параметров?

[no name]

Кто сказал что-нибудь об удостоверении личности? Текст уже является строкой, так почему же вы вызываете ToString для объекта, который уже является строкой?
"мой параметр должен быть", хорошо? Почему вы не ответили на вопрос?
Почему вы утруждаете себя созданием параметра и даже не используете его?
"что вы подразумеваете под созданием 2 параметров", как вы можете не знать? Вместо этого вы создали параметр для своего запроса, если 2, то один для идентификатора, почему вы не создали параметр для SelectedNode? Это простой вопрос. Не то чтобы вы использовали этот параметр, если бы создали его, поскольку вы не используете уже созданный параметр.

Maciej Los

Ваш код таков SQL-инъекция уязвимая!

1 Ответов

Рейтинг:
12

Wendelius

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

Другое дело-отсутствие использования блоков, которые должны использоваться для того, чтобы правильно распоряжаться объектами.

Что касается тех, взгляните на Правильное выполнение операций с базой данных[^], однако имейте в виду, что вы не можете использовать параметры для имен таблиц, только значения строк.

Что касается самого удаления, то, как уже указывалось, вы всегда показываете окно сообщения. Но другой вопрос, Правильно ли используется идентификатор в ваших критериях? В настоящее время вы, кажется, используете порядковый номер столбца:

Database1DataSet.Tables(TreeView1.SelectedNode.ToString).Columns("Id").Ordinal.ToString
Это всегда дает положение столбца, а не значение данных. Поэтому попробуйте удалить порядковый номер и использовать вместо него фактическое значение. Вам просто нужно указать строку, из которой вы хотите получить значение. Видеть объект DataTable.Свойства Строки (Системы.Сведения)[^]


Maciej Los

5ед!

Wendelius

Спасибо!

Member 11856456

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

Wendelius

Точно, вам нужно фактическое значение из строки из таблицы. Рад, что все решено :)