SQL Server:删除用户

时间:2018-12-10 15:01:47

标签: sql sql-server vb.net

我正在尝试编写查询以从SQL Server数据库中删除用户注册,但是当我尝试删除用户时,出现此错误:

  

System.InvalidOperationException:'ExecuteReader:连接属性尚未初始化。'

我的代码:

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

3 个答案:

答案 0 :(得分:4)

<罢工> 您需要先打开连接,然后才能创建命令。 即

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

但是,您当前的代码包含SQL Injection。您不应该使用连接字符串来获取SQL。您应该使用参数。有关该应用程序的详细说明,请参见this answer

以纯文本存储密码永远不是一个好习惯。曾经您应该只存储密码的哈希,并比较哈希而不是纯文本。阅读this answer以供参考。还有more background info关于为什么要进行哈希处理

答案 1 :(得分:0)

也许您应该像

一样正确声明conn和cmd变量
OF

答案 2 :(得分:0)

好吧,所以我对其进行了一些修改,但是一切正常,但是当sql在数据库中搜索用户时,它使我返回此错误:

  

System.Data.SqlClient.SqlException:'无效的列名'daniele'。'

daniele是我的用户名

Imports System.Data.SqlClient
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 txtPassword.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=" & txtNUtenteCANC.Text & " AND password=" & txtPUtenteCANC.Text
                    Dim cmdDelete As New SqlClient.SqlCommand(queryDelete, conn)

                    If conn.State = ConnectionState.Closed Then conn.Open()
                    reader.Close()
                    cmdDelete.ExecuteNonQuery()
                    MsgBox("Deleted succesfully!")
                    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()
            txtNUtenteCANC.Clear()
            txtNUtenteCANC.Focus()
            txtPUtenteCONF.Clear()
            txtPUtenteCANC.Clear()
        End If
    End Using
End Sub
End Class