首页 > 解决方案 > 将字符串与表字段值进行比较

问题描述

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

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

为了便于搜索,我制作了一个查询表,其中包含所有带有 field Admin(都是 Yes)和 field 的人Password

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

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

字段 1 字段 2 字段 3(“管理员”)

姓名1 密码1 否

姓名2 密码2 是

姓名3 密码3 是

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

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

标签: vbams-accesssearchrecordset

解决方案


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

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

如果没有找到匹配项,该DLookup函数将返回,您可以使用语句和函数进行测试,例如:NullIfIsNull

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

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

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

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


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

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

作为一般规则,永远不要相信任何能够向您发送原始密码的服务 - 这表明此类服务正在存储密码而没有加密/屏蔽。


推荐阅读