功能比较简单 就是不允许一个用户在多地或者在一台电脑上重复登录 功能实现了 但不一定是最好的方法,在论坛上搜了下,没有特满意或者有些我看不懂,于是花了一晚上搞了个,希望大家提提意见
代码中有个用插入代码框括出来的应该写成cmd.Conne ctio nNa me = "sql"但是论坛有问题,这段代码直接专程cmd.C的输出了
创建了一个用户登录状态表
此主题相关图片如下:无标题.jpg
在afteropenproject添加如下代码,每次登录添加一条记录,同时将同用户名的其它登录记录的state置0
'--------------------添加用户登录状态表,用以限制客户端同时只能登录一次-----------------------
Dim cmd As New SQLCommand
Dim dt As Date
cmd.Conne ctio nNa me = "sql" ‘论坛有问题,直接贴出来会变成cmd.C 使用的时候把空格去掉
cmd.CommandText = "Select GetDate()"
dt = cmd.ExecuteScalar()
'----------------生成登录状态编号, 便于后续查找-----------------
Dim i As String = DataTables("用户登录状态表").sqlCompute("max(Num)")
Dim idx As Integer
If i > "" Then
idx=i+1
Else
idx=1
End If
'----------------生成登录状态编号, 便于后续查找-----------------
_login_num = Format(idx,"0000")
With Tables("用户登录状态表") '将新登录用户信息写入
.AddNew
.Current("Num") = Format(idx,"0000")
.Current("user_ID") = User.Name
.Current("computer_ID") = ComputerId
.Current("login_time") = dt
.Current("refresh_time") = dt
.Current("state") = 1
.Current.save
End With
'查找登录信息中用户名与登录名相同的记录,将所有不属于本次登录的记录state置0
Dim drs As List(of DataRow) = DataTables("用户登录状态表").SQLSelect("user_ID = '" & user.Name & "'")
If drs IsNot Nothing Then
For Each dr As DataRow In drs
If dr("login_time") <> dt Then ‘只要登录名相同,登录时间和本次不一样的 全都置0
dr("state") = 0
dr.Save()
End If
Next
End If
做一个计划管理 我设置的10秒查询 如果发现自己的登录信息state被置0 则强行退出 如果state为1 则刷新时间
Dim dr As DataRow = DataTables("用户登录状态表").SQLFind("Num = '" & _login_num & "'")
If dr IsNot Nothing Then
If dr("state") = "1" Then
Dim cmd As New SQLCommand
Dim dt As Date
cmd.Conne ctio nNa me = "sql" ‘论坛有问题,直接贴出来会变成cmd.C 使用的时候把空格去掉
cmd.CommandText = "Select GetDate()"
dt = cmd.ExecuteScalar()
dr("refresh_time") = dt
dr.Save
Else
MyTimers("查询用户登录状态").Enabled = False '防止不停跳出提示窗口
Messagebox.show("账号:" & user.Name & " 在其它地方登录,系统将被强行退出,如有异常,请联系管理员","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
Syscmd.Project.Exit(False)
End If
Else
Messagebox.show("账号:" & user.Name & " 由于登录状态信息不存在,系统将被强行退出,请重新登录系统,如有异常,请联系管理员","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
Syscmd.Project.Exit(False)
End If
If User.Type = UserTypeEnum.Developer Then
DataTables("用户登录状态表").LoadFilter = ""
DataTables("用户登录状态表").Load
End If
在beforcloseproject添加如下代码 用来清除正常退出或者强制退出的本次登录生成的记录 同时将属于同用户登录的其它记录中state为0的(不正常退出)的记录都清除
'删除本次登录状态记录
Dim dr As DataRow = DataTables("用户登录状态表").SQLFind("Num = '" & _login_num & "'")
If dr IsNot Nothing Then
dr.Delete
dr.Save
End If
'查询是否有状态记录用户名等于本次登录用户名且state为0的记录,如果有则清除,以此消除非正常退出留下的记录
Dim drs As List(of DataRow) = DataTables("用户登录状态表").SQLSelect("user_ID = '" & user.Name & "'")
If drs IsNot Nothing Then
For Each dr1 As DataRow In drs
If dr1("state") = "0" Then
dr1.Delete
dr1.Save()
End If
Next
End If
[此贴子已经被作者于2014-11-3 15:53:28编辑过]