是否有更快的DLookup替代方案?

时间:2013-03-07 02:19:37

标签: ms-access-2007 access-vba

我正在使用DLookup来搜索表格中的字段。它运行正常,但速度很慢。我有什么办法可以加快速度吗?

这是我现有的代码:

Private Sub cmdLogin_Click()

strUserLevel = ""

If IsNull(Me.cmbUserName) Or Me.cmbUserName = "" Then
    MsgBox "You must enter a User Name.", vbOKOnly, "Required Data"
    Me.cmbUserName.SetFocus
    Exit Sub
End If

If IsNull(Me.txtPassword) Or Me.txtPassword = "" Then
        MsgBox "You must enter a Password.", vbOKOnly, "Required Data"
        Me.txtPassword.SetFocus
    Exit Sub
End If

'strUserName = cmbUserName.Value

If Me.txtPassword.Value = DLookup("Password", "tableUser", "[lngEmpID]=" & Me.cmbUserName.Value) Then
    lngMyEmpID = Me.cmbUserName.Value
    strUserLevel = DLookup("Department", "tableUser", "[lngEmpID]=" & Me.cmbUserName.Value)
    strUserName = DLookup("User_Name", "tableUser", "[lngEmpID]=" & Me.cmbUserName.Value)
    boolInventoryMDL = DLookup("Inventory", "tableDepartment", "[Department]=""" & strUserLevel & """")
    boolDispositionMDL = DLookup("Disposition", "tableDepartment", "[Department]=""" & strUserLevel & """")
    boolReviewCloseMDL = DLookup("Review", "tableDepartment", "[Department]=""" & strUserLevel & """")
    boolAdministratorMDL = DLookup("Administrator", "tableDepartment", "[Department]=""" & strUserLevel & """")
    boolUserListMDL = DLookup("UserList", "tableDepartment", "[Department]=""" & strUserLevel & """")
    boolUserLevelMDL = DLookup("UserLevel", "tableDepartment", "[Department]=""" & strUserLevel & """")

    If strUserLevel = "Superuser" Then
        MsgBox "Welcome back Superuser! You can access all the modules here..", vbOKOnly, "Caution"
    Else
        MsgBox "Welcome! Login Success!", vbOKOnly, "Login Page"
    End If
    DoCmd.Close acForm, "frmLogin", acSaveNo
    DoCmd.OpenForm "frmModule"

Else
    MsgBox "Password Invalid.  Please Try Again", vbOKOnly, "Invalid Entry!"
    Me.txtPassword.Value = ""
    Me.txtPassword.SetFocus
End If

End Sub

1 个答案:

答案 0 :(得分:2)

我不相信这个问题是由于DLookup固有的缓慢造成的。相反,问题是代码使用了这么多。

根据tableUser的查询打开一个记录集,并从该记录集中获取所需的值。然后从tableDepartment的查询中打开第二个记录集,并获取剩余的值。

Dim db As DAO.database
Dim qdf As DAO.QueryDef
Dim rs As DAO.Recordset
Dim strSelect As String

strSelect = "SELECT u.Password, u.Department, u.User_Name" & vbCrLf & _
    "FROM tableUser AS u WHERE u.lngEmpID = [which_EmpId];"
Set db = CurrentDb
Set qdf = db.CreateQueryDef(vbNullString, strSelect)
qdf.Parameters("which_EmpId") = Me.cmbUserName
Set rs = qdf.OpenRecordset(dbOpenSnapshot)
If Not rs.EOF Then
    If rs![Password] = Me.txtPassword Then
        strUserLevel = rs!Department
        strUserName = rs!User_Name
        rs.Close

        ' open another recordset from a query of tableDepartment
        ' to retrieve your bool????? values

    End If
End If

在该缩略示例中,我使用临时QueryDef作为参数化SELECT查询。但是,您最好将该SQL保存为命名查询,可能是 qryFetchUserData 。然后在运行时,您可以只打开已保存的查询,而不是每次都重新创建查询。

Set qdf = db.QueryDefs("qryFetchUserData")

为获得最佳效果,您应该在tableUser.lngEmpIDtableDepartment.Department上添加索引(如果它们尚未编入索引)。