【问题标题】:SQL Server : delete userSQL Server:删除用户
【发布时间】:2019-05-11 12:12:23
【问题描述】:

我正在尝试编写查询以从我的 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

【问题讨论】:

  • 哪一行出错了?
  • 只是一个建议。我会用多种方法将其分开。一种查看用户是否存在,另一种只是删除,另一种是调用它们并处理错误。
  • 注意SQL注入!始终使用参数化查询。
  • 不使用参数实在是太糟糕了。这对 sql 注入非常开放,我的朋友 Bobby Tables 喜欢这种编码风格。并且密码应该被加盐和散列,而不是以明文形式存储。
  • 永远不要将密码存储为纯文本 - 对它们进行加盐和散列

标签: sql sql-server vb.net


【解决方案1】:

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

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 关于为什么你应该散列

【讨论】:

  • "您需要先打开连接才能创建命令。"我知道你的经验比我多,但我不同意。可以将实例化的连接发送到 Command 构造函数。它不需要打开。直到最后一刻,我才打开连接;就在执行之前。
  • @Mary Huh,你在这里绝对正确 - 我没有意识到,我总是在将连接传递给命令之前打开连接(尽管这是我编写这个低级代码的非常罕见的情况)
猜你喜欢
  • 2014-05-21
  • 2011-01-02
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 2011-02-19
相关资源
最近更新 更多