设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 4974|回复: 11
打印 上一主题 下一主题

[其它] 防止同一用户重复登录的解决办法(SQL Server)

[复制链接]
跳转到指定楼层
1#
发表于 2010-11-20 23:27:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 红尘如烟 于 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

复制代码

评分

参与人数 2经验 +20 收起 理由
purplerose + 10
todaynew + 10 我很赞同

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享分享 分享淘帖 订阅订阅
2#
发表于 2010-11-21 08:58:19 | 只看该作者
似乎在用户表中加一个字段(逻辑型)来判断是否已经登录比较简单一些吧?

点击这里给我发消息

3#
发表于 2010-11-21 10:25:22 | 只看该作者
todaynew 发表于 2010-11-21 08:58
似乎在用户表中加一个字段(逻辑型)来判断是否已经登录比较简单一些吧?

是否在SQL中用临时表较好呢??
4#
 楼主| 发表于 2010-11-21 11:14:57 | 只看该作者
todaynew 发表于 2010-11-21 08:58
似乎在用户表中加一个字段(逻辑型)来判断是否已经登录比较简单一些吧?

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

还是猫哥理解俺啊!
10#
发表于 2010-11-27 09:07:01 | 只看该作者
红尘的主要意图就是要避免因非正常退出而判断失灵.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-27 09:26 , Processed in 0.098979 second(s), 38 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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