我有一个登录系统,一旦用户正确回答了安全问题,就可以选择更改用户密码。
一切都很好,除了我不知道如何确定它是否成功。
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它应该显示一个消息框,上面写着“成功!”如果成功了,“失败了!”如果不是。我收到一个错误->‘已经有一个与此连接相关的打开DataReader,必须先关闭它。’
发布于 2019-04-21 19:40:08
这不是执行更新查询的正确方式。
您不需要调用任何ExecuteReader,也不需要任何MySqlDataAdapter。当然,让读取器打开会触发您的实际错误,因为连接在没有为读取器服务之前不能执行任何其他命令。但是,您的代码中也有三个不明显的大问题。
您应该始终执行参数化查询,而不要从用户输入中创建连接字符串的sql命令。(搜索Sql注入)。
您应该始终将您的MySqlConnection包含在一个使用语句块中,以便正确地处理它。
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还有另一个问题,但这个问题要解决得更复杂。在数据库中以明文存储密码被认为是非常高的安全风险。在将它们存储到数据库之前,您应该学习如何使用哈希和盐密码。
https://stackoverflow.com/questions/55786003
复制相似问题