将字符串与 Table 字段值进行比较

Compare String with Table fields value

所有程序员大家好,我是 MS Access 的新手,但对 Excel(包括 VBA)有一些经验。到目前为止,我一直在寻找几天并测试了几个建议,但都没有成功。这已经令人沮丧了,我决定直接询问我的情况。

从加载的表单中,我让用户通过输入框输入密码,我需要我的代码在我的 table Crewlist、字段 Password 中搜索该字符串,标准是另一个字段 Admin (Yes/No)。

为了便于搜索,我进行了一个查询 table,其中包含字段为 Admin(全部为是)和字段为 Password 的所有人。

期待任何特定的解决方案。到目前为止,我已经尝试创建数组和记录集。

编辑 (例如,根据要求 - table 包含需要比较的信息)

字段 1 字段 2 字段 3("Admin")

姓名1 密码1 否

姓名2 密码2 是

姓名3 密码3 是

"If " 语句将 Inputbox 字符串与 Field2 进行比较,其中 Admin=Yes Dlookup 将 return 第一个结果,即 Password2,但 Name3 和 password3 也应该被查找和比较)。

需要记录集和简单的 SQL 代码,我正在处理它。

我建议为此任务使用一个简单的 DLookup 表达式,例如,假设用户输入的密码存储在变量 pwd 中,您可以使用:

DLookup("Password","Crewlist","Admin = True and Password = '" & pwd & "'")

如果找不到匹配项,DLookup 函数将 return Null,您可以使用 If 进行测试语句和 IsNull 函数,例如:

If IsNull(DLookup("Password","Crewlist","Admin = True and Password = '" & pwd & "'")) Then
    MsgBox "Invalid Password!"
Else
    ' Do Stuff
End If

在这里,我只指定Password字段作为要查找的字段,因为DLookup需要一个特定的字段,其值应该是returned。您可以改为使用 DCount 函数并测试 return 是否非零,例如:

If DCount("*","Crewlist","Admin = True and Password = '" & pwd & "'") > 0 Then
    ' Do Stuff
Else
    MsgBox "Invalid Password!"
End If

在按钮的事件处理程序中实现,可以这样写:

Private Sub Command0_Click()
    Dim pwd As String
    pwd = InputBox("Enter Password:", "Password")

    If pwd <> vbNullString Then
        If IsNull(DLookup("Password", "Crewlist", "Admin = True and Password = '" & pwd & "'")) Then
            MsgBox "Invalid Password!"
        Else
            MsgBox "Access Granted!"
        End If
    End If
End Sub

请注意,这只是检查密码,因此,仅使用上述代码,用户可以为 任何 管理员用户指定密码并获得访问权限。

您可以通过附加提示轻松检查用户名:

Private Sub Command0_Click()
    Dim usr As String
    Dim pwd As String

    usr = InputBox("Enter Username:", "Username")
    If usr <> vbNullString Then
        pwd = InputBox("Enter Password:", "Password")
        If pwd <> vbNullString Then
            If IsNull(DLookup("Password", "Crewlist", "Admin = True and Username = '" & usr & "' and Password = '" & pwd & "'")) Then
                MsgBox "Invalid Username or Password!"
            Else
                MsgBox "Access Granted!"
            End If
        End If
    End If
End Sub

但是,如果您要设计自己的模态表单,其中包含用户名的文本框或组合框以及用户可以在其中指定密码的文本框,这会更专业。


此外,将密码以纯文本形式存储在数据库中是一种不好的做法:考虑使用适当的 hash function 对密码进行散列处理并存储散列值。然后,将相同的散列函数应用于用户输入,并使用生成的散列值来测试数据库中的匹配项。

这样一来,只有用户知道密码 - 因为散列是一种单向过程,即使是数据库管理员也不知道用户的密码。如果用户需要更改他们的密码,他们要么会获得一个他们可以更改的新临时密码,要么会在其他一些身份验证后提供一个新密码。

作为一般规则,永远不要相信任何能够向您发送原始密码的服务 - 这表明此类服务会在没有 encryption/masking 的情况下存储密码。

这就是我今天早上在阅读了一些关于记录集和循环的例子后得到的。我的代码在 VBA

Sub Auto_Logo0_Dblclick
Dim AdmPass As String
AdmPass = Inputbox ("Admin password required")

'next part is taken from my guide book for Access
Dim Con1 As ADODB.Connection
Set Con1 = CurrentProject.Connection
Dim rcrdPass As New ADODB.Recordset
rcrdPass.Activeconnection = Con1

'SQL part
 Dim mySQL as String
    mySQL = "SELECT Crewlist.Surname, Crewlist.Password,"
    mySQL = mySQL & " Crewlist.Admin"
    mySQL = mySQL & " From Crewlist"
    mySQL = mySQL & " Where (Crewlist.Admin = 'Yes')"
 rcrdPass.Open mySQL
    With rcrdPass
          If Not .BOF And Not .EOF Then
             .MoveFirst
             .MoveLast
           While (Not .EOF)
              If AdmPass = rcrdPass.Fields("Password") Then
                 Call DoCmd.SelectObject(acTable,,True)
                 Else Msgbox ("Wrong password, try again")
                 End If
             .MoveNext
           Wend
      End If
 End With
 rcrdPass.Close
 Set rcrdPass = Nothing
 Set Con1 = Nothing
 End sub