SQL Server: удалить пользователя

Я пытаюсь написать запрос на удаление регистрации пользователя из моей базы данных SQL Server, но когда я пытаюсь удалить пользователя, я получаю эту ошибку:

System.InvalidOperationException: 'ExecuteReader: Connection property has not been initialized.'

Мой код:

Public Class DeleteForm
Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click
    Dim conn = New SqlConnection("Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=dbProject;Integrated Security=True")

    Using cmd = New SqlCommand("SELECT * FROM tblLogin WHERE username = " & txtUsername.Text, conn)
        conn.Open()
        Dim reader As SqlClient.SqlDataReader = cmd.ExecuteReader

        If reader.Read = True Then
            If txtUserPass.Text = txtCheckPass.Text Then
                Dim deleteOk As Integer = MessageBox.Show("This cant be undone!" & vbCrLf & "Are you sure?", "Warning!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning)
                If deleteOk = DialogResult.Yes Then
                    Dim queryDelete As String = "DELETE FROM tblLogin WHERE username = " & txtUsername.Text & " and password = " & txtPassword.Text
                    Dim cmdDelete As New SqlClient.SqlCommand(queryDelete, conn)

                    If conn.State = ConnectionState.Closed Then conn.Open()
                    reader.Close()
                    cmdDelete.ExecuteNonQuery()
                    MsgBox("Cancellazione eseguita correttamente!")
                    cmdDelete.Dispose()
                    conn.Close()
                ElseIf deleteOk = DialogResult.No Then

                End If
            Else
                MsgBox("The passwords arent matching!")
            End If
        Else
            MsgBox("User not found")
            conn.Close()
            txtUsername.Clear()
            txtUsername.Focus()
            txtUserPass.Clear()
            txtCheckPass.Clear()
        End If
    End Using
  End Sub
End Class

На какой строке идет ошибка?

UnhandledExcepSean 10.12.2018 16:10

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

the_lotus 10.12.2018 16:15

Помните о SQL-инъекции! Всегда используйте параметризованные запросы.

Alejandro 10.12.2018 16:17

Не использовать параметры просто ужасно. Это широко открыто для внедрения sql, и моему другу Столы Бобби нравится этот стиль кодирования. И пароли должны быть солеными и хешированными, а не храниться в открытом виде.

Sean Lange 10.12.2018 16:25

Никогда не храните пароли в виде простого текста - солите их и хешируйте

Ňɏssa Pøngjǣrdenlarp 10.12.2018 18:18
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
228
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам необходимо открыть соединение, прежде чем вы сможете создать команду. т.е.

Dim conn = New SqlConnection("Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=dbProject;Integrated Security=True")
conn.Open()
Using cmd = New SqlCommand(....

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

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

«Перед созданием команды необходимо открыть соединение». Я знаю, что у вас намного больше опыта, чем у меня, но я не согласен. Созданное соединение можно отправить конструктору Command. Его не нужно открывать. Я никогда не открываю соединение до последнего момента; прямо перед казнью.

Mary 10.12.2018 21:20

@ Мэри Ха, вы здесь абсолютно правы - я этого не осознавал, я всегда открывал соединение, прежде чем передавать его командам (хотя это очень редкий случай, когда я пишу этот низкоуровневый код)

trailmax 10.12.2018 22:42

Другие вопросы по теме