Я пытаюсь написать запрос на удаление регистрации пользователя из моей базы данных 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
Просто предложение. Я бы разделил это на несколько методов. Один, который проверяет, существует ли пользователь, другой, который просто удаляет, и один, который вызывает их и обрабатывает ошибки.
Помните о SQL-инъекции! Всегда используйте параметризованные запросы.
Не использовать параметры просто ужасно. Это широко открыто для внедрения sql, и моему другу Столы Бобби нравится этот стиль кодирования. И пароли должны быть солеными и хешированными, а не храниться в открытом виде.
Никогда не храните пароли в виде простого текста - солите их и хешируйте


Вам необходимо открыть соединение, прежде чем вы сможете создать команду.
т.е.
Dim conn = New SqlConnection("Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=dbProject;Integrated Security=True")
conn.Open()
Using cmd = New SqlCommand(....
Однако ваш текущий код содержит SQL-инъекция. Вы не должны объединять строки, чтобы получить свой SQL. Вам следует использовать параметры. См. этот ответ для лучшего объяснения приложения.
Также никогда не рекомендуется хранить пароли в виде обычного текста. Всегда. Вы должны хранить только хэш пароля и сравнивать хеши, а не простой текст. Прочтите этот ответ для справки. И дополнительная справочная информация о том, почему вы должны хешировать
«Перед созданием команды необходимо открыть соединение». Я знаю, что у вас намного больше опыта, чем у меня, но я не согласен. Созданное соединение можно отправить конструктору Command. Его не нужно открывать. Я никогда не открываю соединение до последнего момента; прямо перед казнью.
@ Мэри Ха, вы здесь абсолютно правы - я этого не осознавал, я всегда открывал соединение, прежде чем передавать его командам (хотя это очень редкий случай, когда я пишу этот низкоуровневый код)
На какой строке идет ошибка?