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