我有一个登录系统,一旦他们正确回答了安全问题,就可以选择更改用户密码。
一切正常,除了我不确定如何确定是否成功。
If TextBox1.Text = TextBox2.Text Then
Dim conn As MySqlConnection
conn = New MySqlConnection("server=localhost; user id=root; password=; database=testing")
Dim username As Boolean = True
conn.Open()
Dim sqlquery As String = "UPDATE user SET password='" & TextBox1.Text & "' WHERE id='" & frmLogin.CurrentUserID & "';"
Dim data As MySqlDataReader
Dim adapter As New MySqlDataAdapter
Dim command As New MySqlCommand
command.CommandText = sqlquery
command.Connection = conn
adapter.SelectCommand = command
data = command.ExecuteReader
Dim i As Integer = command.ExecuteNonQuery()
If (i > 0) Then
MessageBox.Show("Success!")
Else
MessageBox.Show("Failed!")
End If
data.Close()
conn.Close()
Else
MsgBox("Passwords must match!")
End If
它应该显示一个消息框,显示“成功!”。如果成功,并且“失败!”如果不。我收到一个错误->“已经有一个与此Connection关联的打开的DataReader,必须先关闭它。”
答案 0 :(得分:3)
这不是执行UPDATE查询的正确方法。
您不需要调用任何 ExecuteReader ,也不需要任何 MySqlDataAdapter 。当然,使阅读器保持打开状态会触发您的实际错误,因为该连接在释放服务于阅读器之前无法执行任何其他命令。
但是,您的代码中还存在三个尚不明显的大问题。
您应该始终执行参数化查询,并且永远不要创建从用户输入连接字符串的sql命令。 (搜索Sql Injection)。
您应该始终将MySqlConnection封装在using statement block中以正确处理它。
Using conn as MySqlConnection = New MySqlConnection("server=localhost; user id=root; password=; database=testing")
Dim username As Boolean = True
conn.Open()
Dim sqlquery As String = "UPDATE user SET password=@pass WHERE id=@id"
Dim command As New MySqlCommand
command.CommandText = sqlquery
command.Connection = conn
command.Parameters.Add("@pass", MySqlDbType.VarChar).Value = TextBox1.Text
command.Parameters.Add("@id", MySqlDbType.Int32).Value = frmLogin.CurrentUserID
Dim i As Integer = command.ExecuteNonQuery()
If (i > 0) Then
MessageBox.Show("Success!")
Else
MessageBox.Show("Failed!")
End If
End Using
还有另一个问题,但是解决起来比较复杂。将密码以明文形式存储在数据库中被认为具有很高的安全风险。您应该先了解如何Hash and Salt passwords,然后再将其存储在数据库中