合作开发收费系统——临时表解决用户重复登录问题

来源:互联网 发布:上海行知小学怎么样 编辑:程序博客网 时间:2024/04/28 22:52

    用户重复登录问题,是指同一个用户能够用自己的账户和密码能够同时多次登录。这样的情况在实际使用中是不允许的,就跟QQ、飞信一样,如果你已经登录,等到再次登录的时候,系统就会提醒你“该账户已经登录,不允许重复登录!”
    在首次解决这个问题的时候,我是在数据库中建立一个T_Onduty的表,负责写入登录用户的登录信息,等到用户退出系统的时候,再去删除表中该信息的。当某用户登录的时候,首先去查询这张表是否有该用户的登录信息,若有信息,则代表其已经登录,提示其能重复登录;反之则能正常登录。
    在理想状况下,只要用户正常退出系统,就能保证这个方法有效。但是我们不但要面对正常情况,更要面对异常情况,能面对异常才是健壮的程序。试想,如果用户正常登录后,登录信息已经写入T_Oduty ,此时突然遭遇断电,表中的信息没有按照设定删除,待到该用户下次登录的时候可想而知,肯定被提示已经登陆了,用户肯定会以为活见鬼了,这是我们不想看到的。T_Onduty是固定的表,后来换做临时表解决了这个问题。
    建立一个临时表,来存储该用户登录信息,该表不但能像固定的表防止二次登录,当系统关闭(无论是正常或异常)的时候,该表自动被数据库删除了,下次登录的时候就不会提示二次登录了。
    为了调用方便,我们用存储过程完成了该功能:
存储过程的实现:
ALTER procedure [dbo].[PROC_UserLogin]@userID char(10),--用户名@loginDate char(10),--登录日期@loginTime char(10),--登录时间@user char(10)as beginif OBJECT_ID ('tempdb.##T_Onduty')is null--如果数据库临时表不存在,执行以下操作begin create table ##T_Onduty(userID char(10) ,loginDate char(10),longinTime char(10) )--创建临时表insert ##T_Onduty  values (@userID) ,(@loginDate) ,(@loginTime)--创建表的同时,将登录信息写入登录信息return '1'--返回代表首次登录,允许其登录endelse--如果临时表已存在,做一下操作select @user =userID from ##T_Onduty where userID =@userID --查询该用户的信息if @userID=null --若不存在记录,则代表没有登录begininsert ##T_Onduty values (@userID) ,(@loginDate ),(@loginTime )--将登录信息写入临时表return '1'--返回代表首次登录,允许其登录endelse--如果存在该用户的信息beginreturn '0'--返回代表已经登录,提示不允许期登录endend
调用存储过程:
 Public Function ExecuteProce(ByVal strPro As String, ByVal cmdType As CommandType, ByVal userEn As En.User) As Integer        cmdSQL.Parameters.Add(New SqlParameter("@userID", userEn.userID)) '添加传入参数@userID        cmdSQL.Parameters.Add(New SqlParameter("@outResult", SqlDbType.BigInt)) '添加传入参数@outResult        cmdSQL.Parameters("@outResult").Direction = ParameterDirection.Output '添加传出参数@outResult        cmdSQL.CommandType = cmdType '设置命令类型为存储过程        cmdSQL.Connection = cnnSQL '指定链接字符串        cmdSQL.CommandText = strPro '指定存储过程        Try            cnnSQL.Open()            cmdSQL.ExecuteNonQuery()            Return cmdSQL.Parameters("@outResult").Value()            cmdSQL.Parameters.Clear()        Catch ex As Exception            Return Nothing        Finally            Call CloseSQLConnection()            Call CloseSQLCommand()        End Try    End Function


1 0