【问题标题】:"Incorrect Username & Password" Although Correct?“不正确的用户名和密码”虽然正确?
【发布时间】:2016-06-17 13:04:09
【问题描述】:

我有一个 MS Access 2016 数据库,用户使用用户名和密码登录数据库。然后代码会打开一组表单,但是有一个我找不到的错误。

Private Sub btnLogin_Click()
If IsNull(Me.txtBoxUsername) Then
    MsgBox "Please Enter Username", vbInformation, "Username Required"
    Me.txtBoxUsername.SetFocus
ElseIf IsNull(Me.txtBoxPassword) Then
    MsgBox "Please Enter Password", vbInformation, "Password Required"
    Me.txtBoxPassword.SetFocus
Else
    'proccess the job
    If ((IsNull(DLookup("Username", "Staff Table", "Username='& Me.txtBoxUsername.Value &'"))) Or _
    (IsNull(DLookup("Password", "Staff Table", "Password='& Me.txtBoxPassword.Value &'")))) Then
        MsgBox "Incorrect Username Or Password"
    Else
        MsgBox "Username & Password Correct"
        DoCmd.OpenForm "Branch Form"
        DoCmd.OpenForm "Customer Form"
        DoCmd.OpenForm "Item Form"
        DoCmd.OpenForm "Order Form"
        DoCmd.OpenForm "Staff Form"
    End If
End If
End Sub

员工的用户名和密码是“RJ1”。当我尝试使用这些凭据登录时,会出现 MsgBox "Incorrect Username Or Password"

为什么会这样?

*作为对 HansUp 问题“错误信息是什么?”的回答

解决方案:

Private Sub btnLogin_Click()

Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strSelect As String
strSelect = "SELECT Count(*) FROM [Staff Table]" & vbCrLf & _
    "WHERE Username=[pUser] AND [Password]=[pPWD];"
Set db = CurrentDb
Set qdf = db.CreateQueryDef(vbNullString, strSelect)
qdf.Parameters("pUser").Value = Me!txtBoxUsername.Value
qdf.Parameters("pPWD").Value = Me!txtBoxPassword.Value
If qdf.OpenRecordset(dbOpenSnapshot)(0) = 0 Then

End If

If IsNull(Me.txtBoxUsername) Then

    MsgBox "Please Enter Username", vbInformation, "Username Required"
    Me.txtBoxUsername.SetFocus

ElseIf IsNull(Me.txtBoxPassword) Then

    MsgBox "Please Enter Password", vbInformation, "Password Required"
    Me.txtBoxPassword.SetFocus

Else
    'proccess the job
    If ((IsNull(DLookup("[Username]", "Staff Table", "[Username] = '" & Me.txtBoxUsername.Value & "'"))) Or _
(IsNull(DLookup("[Password]", "Staff Table", "[Password] = '" & Me.txtBoxPassword.Value & "'")))) Then
        MsgBox "Incorrect Username Or Password"
    Else
        DoCmd.OpenForm "Branch Form"
        DoCmd.OpenForm "Customer Form"
        DoCmd.OpenForm "Item Form"
        DoCmd.OpenForm "Order Form"
        DoCmd.OpenForm "Staff Form"
    End If

End If
End Sub

【问题讨论】:

  • 逻辑似乎不错。你确定Me.txtBoxUsername.ValueMe.txtBoxPassword.Value 是你认为的那样吗? IE。当你调试它们的值是RJ1?
  • 另外,您可以使用参数化记录集来确认用户/密码,它不存在用户输入' 和 dlookup 失败的风险。此外,当您获得确认记录集时,您还将拥有其他可能有用的列,例如权限。
  • 看起来我可以输入我的用户名和我的同事密码,它会让我进入。DLookups 不应该在“员工表”的同一行中搜索匹配的条目吗?
  • @Brad 是的,RJ1 是用户名和密码。 Me.txtBoxUsername.ValueMe.txtBoxPassword.Value 对于这个工作人员来说都是一样的。
  • @ChristopherD。我不确定这是否可行,尽管错误是持续存在的,因此目前还无法测试。

标签: ms-access vba


【解决方案1】:

作为Christopher pointed out,此If 表达式评估用户名和密码是否在Staff Table 中找到,但不一定在同一行中找到。因此,如果您提交一个用户的名称和另一个用户的密码,此逻辑会将这些值视为有效组合:

'proccess the job
If ((IsNull(DLookup("Username", "Staff Table", "Username='" & Me.txtBoxUsername.Value & "'"))) Or _
    (IsNull(DLookup("[Password]", "Staff Table", "[Password]='" & Me.txtBoxPassword.Value & "'")))) Then
    ' Note: quotes added .....................................^.............................^

确保检查用户名和密码是否存在于同一行:

Dim strCriteria As String
strCriteria  = "Username='" & Me.txtBoxUsername.Value & "' AND [Password]='" & Me.txtBoxPassword.Value & "'"
Debug.Print strCriteria '<- inspect in Immediate window; Ctrl+g will take you there
If DCount("*", "Staff Table", strCriteria) = 0 Then
    MsgBox "Incorrect Username Or Password"
End If

虽然该更改在逻辑上可能是正确的,但当用户名或密码包含撇号时,它可能会中断。一个不那么脆弱的方法是基于参数查询的Recordset

Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim strSelect As String
strSelect = "SELECT Count(*) FROM [Staff Table]" & vbCrLf & _
    "WHERE Username=[pUser] AND [Password]=[pPWD];"
Set db = CurrentDb
Set qdf = db.CreateQueryDef(vbNullString, strSelect)
qdf.Parameters("pUser").Value = Me!txtBoxUsername.Value
qdf.Parameters("pPWD").Value = Me!txtBoxPassword.Value
If qdf.OpenRecordset(dbOpenSnapshot)(0) = 0 Then
    MsgBox "Incorrect Username Or Password"
End If

【讨论】:

  • 无论用户名和密码如何,单击“登录”按钮后都会返回错误。另外,"WHERE Username=[pUser] AND [Password]=[pPWD];" 中缺少的括号是否会导致此错误?
  • 哪一行触发了错误,错误信息是什么?
  • 我不确定是哪一行,尽管第 5 行在Username 的开头和结尾处缺少括号,因为它们在单词Password 上可见。
  • 我将Password 括起来,因为它是reserved wordUsername 不是保留字,但如果你愿意的话,无论如何你都可以用括号括起来……这应该没什么区别。您面临的错误是由于其他原因造成的。
  • 好的,这不是问题。我不确定是什么。我会进一步调查。
【解决方案2】:

我认为您的 DLookups 因语法错误而失败。试试:

If ((IsNull(DLookup("[Username]", "Staff Table", "[Username] = '" & Me.txtBoxUsername.Value & "'"))) Or _
(IsNull(DLookup("[Password]", "Staff Table", "[Password] = '" & Me.txtBoxPassword.Value & "'")))) Then

【讨论】:

  • 刚刚看到您的双引号也没有正确连接字符串。我已经编辑了我的答案。
  • 太棒了,成功了。在用户名和密码字段中输入RJ1 后,会显示一条消息,说明用户名和密码正确,然后打开所有 5 个表单。 :D
猜你喜欢
  • 2015-06-08
  • 2017-10-25
  • 2017-03-16
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 2012-05-14
相关资源
最近更新 更多