我有这个代码可以完美运行但只有我遇到的问题是,当我输入数据库中不存在的用户名或密码时,此代码仍会显示消息“密码已成功更改”,而不会对db或错误信息。
我想知道一种方法来处理这个问题。有没有办法在WHERE
条件失败时显示消息?
Try
If txtBoxSettingNewPassword.Text = txtBoxSettingConfPassword.Text Then
con.Open()
cmd.Connection = con
cmd.CommandType = System.Data.CommandType.Text
cmd.CommandText = ("UPDATE [User] " & _
"SET password = '" & (txtBoxSettingNewPassword.Text) & "'" & _
"WHERE user_name ='" & (txtBoxSettingUserName.Text) & "'" & " and password = '" & (txtBoxSettingOldPassword.Text) & "';")
cmd.ExecuteNonQuery()
MessageBox.Show("password changed successfully")
Else
MessageBox.Show("Passwords do not match")
End If
Catch ex As Exception
MessageBox.Show("Something went wrong," & ex.Message)
Finally
con.Close()
End Try
提前致谢
答案 0 :(得分:2)
你需要移动你的
MessageBox.Show("password changed successfully")
每当你进行更新时,在if块之外的,无论是否成功,都会显示该消息,因为没有代码可以检查它是否成功。
您可以尝试这样:
cmd = New OleDbCommand("update .....", cn)
rowCount = cmd.ExecuteNonQuery()
If rowCount < 1 Then
MessageBox.Show("password changed successfully")
旁注:
您的代码对SQL Injection是开放的。您需要使用参数化查询来避免这种情况。
答案 1 :(得分:0)
如果找不到匹配项,则SQL update命令不会出错。
您对ExecuteNonQuery的调用具有可以分配给整数的返回值。 e.g。
numRows = cmd.ExecuteNonQuery()
如果此值为零,则表示找不到匹配项,因此您应报告错误。
答案 2 :(得分:0)
我会在这里做一些防御性编码,并在运行更新之前检查用户是否存在,而不是依赖于catch。它没那么高效,因为有两次数据库往返。
将try / catch留给意外错误......不是您可能知道的错误。