在vb.net中通过连接mysql更改密码

在vb.net中通过连接mysql更改密码,mysql,vb.net,Mysql,Vb.net,当我单击按钮时,它不会更新数据库中的数据。我有3个文本框,一个是输入用户名,第二个是输入旧密码,第三个是输入新密码 Dim con As New MySqlConnection("host=localhost; username=root; password=; database=pawnshop") Dim cmd As New MySqlCommand Dim dr As MySqlDataReader con.Open() cmd.Connection

当我单击按钮时,它不会更新数据库中的数据。我有3个文本框,一个是输入用户名,第二个是输入旧密码,第三个是输入新密码

  Dim con As New MySqlConnection("host=localhost; username=root; password=; database=pawnshop")
    Dim cmd As New MySqlCommand
    Dim dr As MySqlDataReader

    con.Open()
    cmd.Connection = con
    cmd.CommandText = " select password from login where password ='" & txtChange.Text & "'"

    dr = cmd.ExecuteReader
    If dr.HasRows Then

        cmd.Connection = con
        cmd.CommandText = " UPDATE login SET password ='" & txtConfirm.Text & "' where userid = '" & txtUser.Text & "'"

    Else
        MsgBox("Password is not correct")

    End If

我没有看到您的
UPDATE
命令的
cmd.ExecuteReader
。你错过了吗,或者只是在帖子上错过了。您应该执行以下查询:

    If dr.HasRows Then

        cmd.Connection = con
        cmd.CommandText = " UPDATE login SET password ='" & txtConfirm.Text & "' where userid = '" & txtUser.Text & "'"
       dr = cmd.ExecuteReader // missing statement
    Else
        MsgBox("Password is not correct")

    End If
密码是一个密码。如果您有使用此名称的字段,您应该记住始终在该单词周围加上反勾号

您的代码需要重写,以避免Sql注入、解析问题、资源泄漏以及性能方面的一些改进

Using con = New MySqlConnection(......)
Using cmd = New MySqlCommand()
    con.Open()
    cmd.Connection = con
    cmd.CommandText = "select `password` from login where `password` =@oldp"
    cmd.Parameters.Add("@oldp", MySqlDbType.String).Value = txtChange.Text 
    Dim result = cmd.ExecuteScalar()
    if result IsNot Nothing then
       cmd.Parameters.Clear()
       cmd.CommandText = "UPDATE login SET `password` = @newp where userid = @uid"
       cmd.Parameters.Add("@newp", MySqlDbType.String).Value = txtConfirm.Text 
       cmd.Parameters.Add("@uid", MySqlDbType.Int32).Value = txtUser.Text 
       cmd.ExecuteNonQuery()
    Else
       MsgBox("Password is not correct")

    End If
End Using
End Using
  • 资源泄漏-Using语句确保在出现异常的情况下正确处理每个一次性对象
  • Sql注入-使用字符串连接使攻击者很容易破坏数据库
  • 解析问题如果其中一个字符串值包含一个引号,字符串连接也会失败
  • 性能-由于许多原因,创建数据读取器很麻烦。如果只需要从一行中读取一列,则ExecuteScalar会更快,并且在关闭读卡器之前不会阻止连接。(您的代码无法工作,因为读卡器使连接处于繁忙状态,并且在关闭读卡器之前,您无法使用与该命令的连接。)

  • 另一个需要注意的问题是明文密码问题。如果将用户的密码以明文形式存储在数据库中,则可以使用任何管理工具访问数据库的所有人(MySqlWorkbench、phpMyAdmin…)您可以轻松了解所有用户的密码。这是一个更复杂的问题,如果您搜索此网站,您会发现许多有关此问题的问题/答案

    您是否收到任何错误消息?请尽快开始使用参数化查询您不执行更新查询…使用用户名“O'Bannon”、“D'Angelo”、“O'Grady”测试您的系统或者“O'Keefe”我没有收到任何错误消息+“不要将密码存储为明文”是的,忘了这一点。