设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2239|回复: 9
打印 上一主题 下一主题

[模块/函数] 冗余与简化——从登录窗体谈起

[复制链接]
跳转到指定楼层
1#
发表于 2017-2-24 18:04:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
先贴一段常见的代码:
  1. Dim rs As New ADODB.Recordset
  2. Dim strSQL As String
  3. Dim i As Integer

  4. Private Sub cmd确定_Click()
  5. On Error GoTo err_确定_Click
  6. '先判断是否输入用户名
  7. If IsNull(Me.txt用户名) Then
  8.     MsgBox "请输入登录名", vbCritical, "提示"
  9.     Me.txt用户名.SetFocus
  10.     Exit Sub
  11. '接着判断是否输入密码
  12.     ElseIf IsNull(Me.txt密码) Then
  13.         MsgBox "请输入密码!", vbCritical, "提示"
  14.         Me.txt密码.SetFocus
  15.         Exit Sub
  16. '输入用户名才开始判断密码是否正确。
  17.     Else
  18.         strSQL = "select * from 管理员 where 登录名='" & Me.txt用户名 & "'"
  19.         rs.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  20. '如果没记录则弹出错误
  21.         If rs.EOF Or rs.BOF Then
  22.             MsgBox "没有该用户!", vbCritical, "提示"
  23. '如果有记录则判断密码是否正确
  24.         Else
  25. '密码正确时打开窗体
  26.             If rs(1) = Me.txt密码 Then
  27.                 Me.txt用户名 = Null
  28.                 Me.txt密码 = Null
  29.                 Me.Visible = False
  30.                 DoCmd.OpenForm "主页"   '打开主页
  31.             Else
  32. '密码错误时开始计算错误次数
  33.                 i = i + 1
  34. '错误次数低于三次时弹出警告
  35.                 If (i < 3) Then
  36.                     MsgBox "您输入的密码不正确", vbOKOnly + vbExclamation, "提示"
  37. '错误次数等于三次后关闭窗体并退出
  38.                 Else
  39.                     MsgBox "您已经连续3次错误输入密码,系统马上关闭!", vbOKOnly + vbExclamation, "警告"
  40.                     DoCmd.Close acForm, Me.Name '关闭当前窗体
  41.                     DoCmd.Quit '退出数据库
  42.                     Exit Sub
  43.                 End If
  44. '密码错误时设置焦点
  45.                 Me.txt密码 = Null
  46.                 Me.txt用户名 = Null
  47.                 Me.txt用户名.SetFocus
  48.             End If
  49.         End If
  50.         rs.Close
  51.         Set rs = Nothing
  52. End If

  53. exit_确定_Click:
  54.     Exit Sub
  55. err_确定_Click: '错误处理
  56.     MsgBox (Err.Description)
  57.     Resume exit_确定_Click
  58. End Sub
复制代码
注释已经写得很清楚了,我这里就不再一一解释了。现在我们回归到实际应用上,先提出两个问题:
1、是否一定要区分用户输入用户名还是密码?
2、是否一定要输入三次错误就退出。
---------------------------------------
大家先想想这两个问题,分割线
---------------------------------------

---------------------------------------
现在先来看问题1:
从逻辑上来看,我们先判断是否输入用户名,如果输入,接着判断是否输入密码,都输入了再判断密码跟用户名是否匹配。然而,对于我们来说,是否可以把这两步合在一起呢?也就是说,都输入了再判断?如果那样的话,逻辑上就可以省略一个嵌套,而用一个And来判断即可。
再谈谈问题2:
输入三次错误就退出,听起来很像银行卡的玩法。例如输错三次密码就锁定银行卡,需要电话解锁等等。你可以说,也可以跟银行卡那样锁定啊。是的,从理论上讲是可以实现的,把输入错误次数写入数据表,然后每次登录前先核对是否超过规定次数…然而是否有必要,大家可以自行斟酌。而这段代码的问题在于,使用的是公共变量。输错三次退出后,重新登录时又可以输入三次。所以,在实际情况中,这段代码属于冗余的。
---------------------------------------
基于上面的考虑,我们接下来开始简化代码:
  1. Private Sub cmd确定_Click()
  2.     Dim lngNum As Long
  3.     On Error GoTo err_确定_Click
  4.    
  5.     strSQL = "select count(登录名) from 管理员 where 登录名='" & Me.txt用户名 _
  6.             & "' and 密码='" & Me.txt密码 & "'"
  7.             
  8.     rs.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  9.     lngNum = rs(0)
  10.    
  11.     If IsNull(Me.txt用户名) Then
  12.         MsgBox ("请输入用户名!"), vbInformation, "出错"
  13.     ElseIf IsNull(Me.txt密码) Then
  14.         MsgBox ("请输入用户密码!"), vbInformation, "出错"
  15.     ElseIf lngNum <> 1 Then
  16.         MsgBox ("没有这个用户,或者密码错误,重新确认输入后还不能登陆时请通知管理员!"), vbCritical, "出错"
  17.     Else
  18.         DoCmd.OpenForm "主页"
  19.     End If
  20.    
  21.     rs.Close
  22.     Set rs = Nothing
  23.    
  24. exit_确定_Click:
  25.     Exit Sub
  26. err_确定_Click: '错误处理
  27.     MsgBox (Err.Description)
  28.     Resume exit_确定_Click
  29. End Sub
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2017-2-25 11:09:05 | 只看该作者
你用ACCESS用的这么好,能问问你你ACCESS做什么用处?专业开发软件吗?
3#
发表于 2017-2-25 11:45:59 | 只看该作者
1、是否一定要区分用户输入用户名还是密码?
2、是否一定要输入三次错误就退出。

第一个  1、是否一定要区分用户输入用户名还是密码? 这个需要

第二个  2、是否一定要输入三次错误就退出。 这个可要也可以不要
4#
 楼主| 发表于 2017-2-25 14:33:37 | 只看该作者
jsxfygq 发表于 2017-2-25 11:09
你用ACCESS用的这么好,能问问你你ACCESS做什么用处?专业开发软件吗?

混口饭吃。
5#
发表于 2017-2-25 14:53:05 | 只看该作者
应该都要吧,防撞库,是否还要防注入。
6#
发表于 2017-2-25 16:45:36 | 只看该作者
本帖最后由 access新新新手 于 2017-2-25 17:06 编辑

如果用户名用组合框,只可以选择用户名,这样还可以省略一些代码。
Private Sub cmd确定_Click()
1       On Error Resume Next
2       If IsNull(Me.txt用户名) Then
3           MsgBox "请输入登录名", vbCritical, "提示"
4           Me.txt用户名.SetFocus
5       ElseIf IsNull(Me.txt密码) Then
6           MsgBox "请输入密码!", vbCritical, "提示"
7           Me.txt密码.SetFocus
8       ElseIf DLookup("密码", "管理员", "登录名='" & Me.txt用户名 & "'") <> Me.txt密码 Then
9           MsgBox "密码错误!", vbExclamation + vbOKOnly, "系统提示"
10          Me.txt密码 = Null
11          Me.txt密码.SetFocus
12      Else
13          If DLookup("密码", "管理员", "登录名='" & Me.txt用户名 & "'") = Me.txt密码 Then
14              DoCmd.OpenForm "主页"   '打开主页
15          End If
16      End If
End Sub



7#
发表于 2017-2-26 09:59:15 | 只看该作者
Access防撞库,估计有这样需求的项目凤毛麟角。如果真的有这种需求而使用access平台的就更稀少了。如果真的有这种可能性,我觉得应该从以下几个方面考虑:第一,使用存储过程;第二,使用加密算法(我最初就是在客户端使用加密算法的,后来直接做到存储过程里了,功能做了阉割。在客户端实现加密解密系统开销太大);第三,使用vpn,防止未经授权第三方渗透。
8#
发表于 2017-2-26 13:31:57 | 只看该作者
LeeTien 发表于 2017-2-26 09:59
Access防撞库,估计有这样需求的项目凤毛麟角。如果真的有这种需求而使用access平台的就更稀少了。如果真的 ...

9#
发表于 2017-2-27 20:49:13 | 只看该作者
顺便也问你一下,你的OFFICE是什么版本的?群里很多老手用2003版本的很多,而新手都喜欢用最新版本。
10#
 楼主| 发表于 2017-2-28 11:28:02 | 只看该作者
jsxfygq 发表于 2017-2-27 20:49
顺便也问你一下,你的OFFICE是什么版本的?群里很多老手用2003版本的很多,而新手都喜欢用最新版本。

看你的用户群。用2003主要是考虑到部分用户可能还在用2003,为了兼容起见而已。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-22 03:24 , Processed in 0.095251 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表