在開發(fā)管理信息系統(tǒng)的時(shí)候,經(jīng)常會遇到需要防止同一個(gè)用戶多次登錄的問題,這里介紹了一種簡單易行的辦法。
注意:此方法僅適用于以SQL Server作為數(shù)據(jù)庫的情況下。
實(shí)現(xiàn)思路:在SQL Server中,當(dāng)連接斷開之后,系統(tǒng)會自動將臨時(shí)表回收,因此我們就可以通過創(chuàng)建和登錄用戶名對應(yīng)的全局臨時(shí)表,然后登錄時(shí)判斷這個(gè)臨時(shí)表是否存在。如果存在,說明其對應(yīng)的用戶名已登錄,則彈出消息提示不能重復(fù)登錄;如果不存在,則登錄并創(chuàng)建臨時(shí)表。
說明:使用此方法的優(yōu)點(diǎn)再于,已登錄標(biāo)記是在客戶端發(fā)送請求并建立連接后創(chuàng)建的,但退出登錄則不需要客戶端去處理,只要到SQL Server的連接斷開了,這個(gè)標(biāo)記就會被自動銷毀,這個(gè)銷毀操作是由數(shù)據(jù)庫服務(wù)器來執(zhí)行的。因此即使客戶端因?yàn)閿嚯?、程序崩潰一類的原因非正常退出,并且不論一個(gè)用戶是在同一臺電腦上登錄,還是在不同的電腦上登錄,也都是有效的!不需要管理員到用戶表中去修改用戶的登錄狀態(tài)什么的。
Function IsLogged(UserID As String) As Boolean
'判斷指定用戶是否登錄,已登錄返回True
Dim rst As Object
Dim cnn As Object
Set cnn=CreateObject('ADODB.Connection')
cnn.Open 'Provider=SQLOLEDB;Data Source=服務(wù)器名或IP或域名','數(shù)據(jù)庫用戶名','數(shù)據(jù)庫用戶密碼'
Set rst = cnn.Execute('Select OBJECT_ID('##LoggedUser' & UserID & '') AS ID')
If Not IsNull(rst!ID) Then IsLogged=True
rst.Close
cnn.Close
End Function
Function UserLoginRegister(UserID As String) As Boolean
'創(chuàng)建登錄標(biāo)識(即創(chuàng)建用戶名對應(yīng)的臨時(shí)表)
Dim cnn As Object
Set cnn=CreateObject('ADODB.Connection')
cnn.Open 'Provider=SQLOLEDB;Data Source=服務(wù)器名或IP或域名','數(shù)據(jù)庫用戶名','數(shù)據(jù)庫用戶密碼'
cnn.Execute 'Create TABLE ##LoggedUser' & UserID & '(userid varchar(1))'
cnn.Close
End Function
'然后我們在登錄窗體窗體的“登錄”按鈕事件中進(jìn)行如下判定:
Private Sub cmdLogin_Click()
If IsNull(Me.txtUserName) Then
MsgBox '請輸入用戶名!',vbExclation
Exit Sub
End If
If Is Logged(Me.txtUserName) Then
MsgBox '此用戶已登錄!',vbInformation
Else
'密碼驗(yàn)證代碼略
UserLoginRegister Me.txtUserName
DoCmd.OpenForm 'frmMain'
End If
End Sub
聯(lián)系客服