我对访问有一个令人尴尬的问题。我可以在睡眠中建立关系数据库,但我一直使用PHP,mySQL和HTML来构建应用程序。
自从我想起以来,出于各种原因,我一直对Access充满热情,但现在我被困在特定项目中。
我有很多表,其中之一是customer
,其中有username
和password
字段。
当我启动数据库时,我希望显示一个登录表单,可以使用AutoExec
宏来完成,我用用户名和密码字段制作了该表单。之后,我陷入了查询用户名/密码然后显示新表格(如果正确)或错误(如果错误)的逻辑中。
有人可以帮助我使宏和查询一起工作吗?
说明:我试图在不编写整个Visual Basic宏的情况下尝试执行此操作,如果可能的话,我希望能够使用宏生成器Thingumy来执行此操作。
谢谢
Malphas-
实际上可以在不使用VBA的情况下执行此操作,但我想知道您是否不想使用VBA的原因是否是由于Trust问题。在这种情况下,这是不可能的,因为如果数据库不受信任,则不允许执行宏操作Close和Quit。
虽然您可以使用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
请注意,在所有这些示例中,我都使用了嵌入式宏,而不是命名宏,因此可以将它们与表单保持在一起。还请注意最后一个宏中的省略号(...),它代表最后一个条件的值。
给出表单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
对上面的代码稍作调整,因为上面的代码将对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
对上面的代码稍作调整,因为上面的代码将对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