Office中国论坛/Access中国论坛

标题: 防止同一用户重复登录的解决办法(SQL Server) [打印本页]

作者: 红尘如烟    时间: 2010-11-20 23:27
标题: 防止同一用户重复登录的解决办法(SQL Server)
本帖最后由 红尘如烟 于 2010-11-21 13:05 编辑

在开发管理信息系统的时候,经常会遇到需要防止同一个用户多次登录的问题,这里介绍了一种简单易行的办法。
注意:此方法仅适用于以SQL Server作为数据库的情况下。
实现思路:在SQL Server中,当连接断开之后,系统会自动将临时表回收,因此我们就可以通过创建和登录用户名对应的全局临时表,然后登录时判断这个临时表是否存在。如果存在,说明其对应的用户名已登录,则弹出消息提示不能重复登录;如果不存在,则登录并创建临时表。

说明:使用此方法的优点再于,已登录标记是在客户端发送请求并建立连接后创建的,但退出登录则不需要客户端去处理,只要到SQL Server的连接断开了,这个标记就会被自动销毁,这个销毁操作是由数据库服务器来执行的。因此即使客户端因为断电、程序崩溃一类的原因非正常退出,并且不论一个用户是在同一台电脑上登录,还是在不同的电脑上登录,也都是有效的!不需要管理员到用户表中去修改用户的登录状态什么的。

  1. Function IsLogged(UserID As String) As Boolean
  2. '判断指定用户是否登录,已登录返回True
  3.     Dim rst As Object
  4.     Dim cnn As Object

  5.     Set cnn=CreateObject("ADODB.Connection")
  6.     cnn.Open "Provider=SQLOLEDB;Data Source=服务器名或IP或域名","数据库用户名","数据库用户密码"
  7.     Set rst = cnn.Execute("Select OBJECT_ID('##LoggedUser" & UserID & "') AS ID")
  8.     If Not IsNull(rst!ID) Then IsLogged=True
  9.     rst.Close
  10.     cnn.Close
  11. End Function

  12. Function UserLoginRegister(UserID As String) As Boolean
  13. '创建登录标识(即创建用户名对应的临时表)
  14.     Dim cnn As Object
  15.     Set cnn=CreateObject("ADODB.Connection")
  16.     cnn.Open "Provider=SQLOLEDB;Data Source=服务器名或IP或域名","数据库用户名","数据库用户密码"
  17.     cnn.Execute "Create TABLE ##LoggedUser" & UserID & "(userid varchar(1))"
  18.     cnn.Close
  19. End Function

  20. '然后我们在登录窗体窗体的“登录”按钮事件中进行如下判定:
  21. Private Sub cmdLogin_Click()
  22.     If IsNull(Me.txtUserName) Then
  23.         MsgBox "请输入用户名!",vbExclation
  24.         Exit Sub
  25.     End If

  26.     If Is Logged(Me.txtUserName) Then
  27.         MsgBox "此用户已登录!",vbInformation
  28.     Else
  29.        '密码验证代码略
  30.         UserLoginRegister Me.txtUserName
  31.         DoCmd.OpenForm "frmMain"
  32.     End If

  33. End Sub

复制代码


作者: todaynew    时间: 2010-11-21 08:58
似乎在用户表中加一个字段(逻辑型)来判断是否已经登录比较简单一些吧?
作者: t小宝    时间: 2010-11-21 10:25
todaynew 发表于 2010-11-21 08:58
似乎在用户表中加一个字段(逻辑型)来判断是否已经登录比较简单一些吧?

是否在SQL中用临时表较好呢??
作者: 红尘如烟    时间: 2010-11-21 11:14
todaynew 发表于 2010-11-21 08:58
似乎在用户表中加一个字段(逻辑型)来判断是否已经登录比较简单一些吧?

这样简单是简单,登录时将这个字段的值置为1,退出时再还原为0,但解决不了非正常退出的问题,如果遇到断电或程序崩溃之类的情况,除非直接到数据库中把这个值改过,不然这个用户就再也不能登录了
作者: aslxt    时间: 2010-11-21 12:17
可否在todaynew版主的建议中再加一个字段用于保存登录用户的电脑IP,如果登陆时显示用户已经登录,再看是否为同一IP地址,如果ip相同(非正常退出情况),则可以再登录,如果IP不同(说明用户可能在其他电脑登录了,也可能在其他电脑登录,也是非正常退出情况),则不让他登录或提示请求要管理员修改?
作者: ui    时间: 2010-11-22 08:30
谢谢 红尘大侠,收藏了
作者: xuwenning    时间: 2010-11-22 08:51
谢谢分享
学习了
作者: termisss    时间: 2010-11-22 09:46
上班之余,来逛逛论坛.
作者: 咱家是猫    时间: 2010-11-27 09:07
红尘的主要意图就是要避免因非正常退出而判断失灵.
作者: 红尘如烟    时间: 2010-11-27 20:24
咱家是猫 发表于 2010-11-27 09:07
红尘的主要意图就是要避免因非正常退出而判断失灵.

还是猫哥理解俺啊!
作者: itdesigner    时间: 2015-3-28 21:14
谢谢分享
学习了
作者: purplerose    时间: 2015-7-25 21:00
这种方法不错,避免突然断电或者死机造成用户没有正常退出,而使程序判断失误,登录不了。赞一个给红尘如烟




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3