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