Access的登录屏幕,带有表单,宏和查询ms-

问题描述 投票:1回答:3

我对访问有一个令人尴尬的问题。我可以在睡眠中建立关系数据库,但我一直使用PHP,mySQL和HTML来构建应用程序。

自从我想起以来,出于各种原因,我一直对Access充满热情,但现在我被困在特定项目中。

我有很多表,其中之一是customer,其中有usernamepassword字段。

当我启动数据库时,我希望显示一个登录表单,可以使用AutoExec宏来完成,我用用户名和密码字段制作了该表单。之后,我陷入了查询用户名/密码然后显示新表格(如果正确)或错误(如果错误)的逻辑中。

有人可以帮助我使宏和查询一起工作吗?

说明:我试图在不编写整个Visual Basic宏的情况下尝试执行此操作,如果可能的话,我希望能够使用宏生成器Thingumy来执行此操作。

谢谢

ms-access ms-access-2007
3个回答
1
投票

Malphas-

实际上可以在不使用VBA的情况下执行此操作,但我想知道您是否不想使用VBA的原因是否是由于Trust问题。在这种情况下,这是不可能的,因为如果数据库不受信任,则不允许执行宏操作CloseQuit

虽然您可以使用OpenForm命令在AutoExec宏中运行操作,但我认为继续在窗体本身上执行下一个操作比较整洁。首先,因为您无法真正在宏中进行分支;其次,因为它使操作与表单实际保持在表单上更加模块化。

在下面的示例中,我的示例登录表单称为LoginForm,用户名文本框为txtUserName,密码文本框名为txtPassword

[要做的第一件事是保护对话,避免让用户关闭对话并进入数据库设计屏幕的简单行为。最好的方法是在加载表单时设置一个名为ValidLogin的标志。您将在登录过程中设置此标志。关闭窗体后,检查该标志是否为true。如果ValidLogin为false,则关闭数据库。

在登录表单的OnLoad事件上,单击省略号按钮,然后选择Macros Builder。在“宏”屏幕中,使用以下操作(请注意,默认情况下,条件列是隐藏的-但您仅需要以下两个宏):

Line Condition     Action/Arguments

1                  SetTempVar, Name = ValidLogin, Expression = False

在登录表单的OnUnload事件上,执行与上述相同的操作,然后添加:

Line Condition     Action/Arguments

1  Not [TempVars]![ValidLogin]
                   Quit, Options = Exit.

如果现在运行此命令,则关闭表单后,数据库将立即关闭。为了有用,您需要在Login按钮的OnClick事件中添加以下宏操作:

Line Condition     Action/Arguments

1                  SetTempVar, Name = Valid Login, Expression = DCount("*","Customer","[Username]=[Forms]![LoginForm]![txtUserName] And [Password]=[Forms]![LoginForm]![txtPassword]")>0

2 Not [TempVars]![ValidLogin]
                   MsgBox, Message = Invalid Login
3 ...              StopMacro

4                  OpenForm, Form Name = MainForm

5                  Close, Object Type = Form, Object Name = LoginForm, Save = No

请注意,在所有这些示例中,我都使用了嵌入式宏,而不是命名宏,因此可以将它们与表单保持在一起。还请注意最后一个宏中的省略号(...),它代表最后一个条件的值。


3
投票

给出表单frmLogin,其中包含2个文本框,txtUserName和txtPassword,以及一个命令按钮,您可以尝试以下操作

Private Sub Command0_Click()
Dim rec As Recordset2

    Set rec = CurrentDb.OpenRecordset("SELECT * FROM Customer WHERE username = """ & txtUserName.Value & """ AND password = """ & txtPassword.Value & """")
    If (rec.RecordCount > 0) Then
        DoCmd.OpenForm "frmMain"
        DoCmd.Close acForm, "frmLogin"
    End If
End Sub

-1
投票

对上面的代码稍作调整,因为上面的代码将对SQL注入攻击开放(是的,我知道这只是访问,但绝不会造成伤害)

Public Function CheckUserPassword(strUserName As String, strPassword As String) As Boolean
Dim rst As DAO.Recordset
Set rst = DBEngine(0)(0).OpenRecordset("tblUsers", dbOpenTable)
With rst
    .Index = "UserName"
    .Seek "=", strUserName
    If .NoMatch = False Then
      If !Password = strPassword Then
        CheckUserPassword = True
    Else
        CheckUserPassword = False
    End If
Else
    CheckUserPassword = False
End If
End With
rst.Close
Set rst = Nothing

End Function

-1
投票

对上面的代码稍作调整,因为上面的代码将对SQL注入攻击开放(是的,我知道这只是访问,但绝不会造成伤害)

Public Function CheckUserPassword(strUserName As String, strPassword As String) As Boolean
Dim rst As DAO.Recordset
Set rst = DBEngine(0)(0).OpenRecordset("tblUsers", dbOpenTable)
With rst
    .Index = "UserName"
    .Seek "=", strUserName
    If .NoMatch = False Then
      If !Password = strPassword Then
        CheckUserPassword = True
    Else
        CheckUserPassword = False
    End If
Else
    CheckUserPassword = False
End If
End With
rst.Close
Set rst = Nothing

End Function
© www.soinside.com 2019 - 2024. All rights reserved.