為了防止用戶的重復登錄,在一開始想到的一種方法:
在用戶表中添加一個字段,登錄后寫1,退出后寫0.這樣子在用戶登錄進行檢查的時候判斷這個字段是否為0,如果是0那么就可以登錄;但是這樣子就又帶來了新的問題,如果在用戶正在登錄的過程中突然斷電,那么表中寫入的是1,也就是說用戶在以后的登錄中都不能能夠登錄系統了。
另外一種方法:在SQL Server中建立全局臨時表,如果用戶沒有登錄就建立一個臨時表來存放用戶,如果已經登錄那么就提醒用戶此賬號已經登錄;臨時表相比較上面一個方法的好處就在于:當系統與SQL Server數據庫的連接斷開以后,臨時表是可以被系統自動收回的,這樣子用戶下次登錄的時候會再次建立一個臨時表并且可以登錄成功!
依據第二種思路我們建立一個存儲過程:
create proc PROC_FindTemptable /* * 尋找以操作員工號命名的全局臨時表 * 如無則將out參數置為0并創建該表,如有則將out參數置為1 * 在connection斷開連接后,全局臨時表會被SQL Server自動回收 * 如發生斷電之類的意外,全局臨時表雖然還存在于tempdb中,但是已經失去活性 * 用object_id函數去判斷時會認為其不存在. */ @View_userID char(20),--輸入參數 操作員賬號 @outResult int out --輸出參數( 0:沒有登錄 1:已經登錄) as declare @View_sql varchar(100) --object_id函數判斷操作員賬號不存在(沒有的登錄) if OBJECT_ID ('tempdb.dbo.##'+@View_userID )is null begin --創建臨時表 set @View_sql ='create table ##'+@View_userid+'(userid char(20))' exec(@View_sql) --out參數設置為0(賬號沒有登錄) set @outResult =0 end --賬號存在 else --out參數為1 set @outResult =1 --在這個過程中,我們看到如果以用戶工號命名的全局臨時表不存在時過程會去創建一張并把out參數置為0,如果已經存在則將out參數置為1。 --這樣,應用程序中調用該過程時,如果取得的out參數為1時,我們可以毫不客氣地跳出一個message告訴用戶說”對不起,此工號正被使用!” |
在系統中調用存儲過程來實現用戶登錄的代碼:將與數據庫的連接和執行存儲過程寫在一個函數中,然后在客戶端調用即可!
Public Function ExecuteProcTestID(ByVal strID As String, ByVal strProc As String) As Integer Dim myConnection As New SqlConnection(CmdString) '定義連接 Dim Cmd As New SqlCommand '表示SQL命令語句的執行 '連接數據庫將存儲名稱和參數傳遞給cmd Cmd.Connection = myConnection '指明為存儲過程 Cmd.CommandType = CommandType.StoredProcedure Cmd.CommandText = strProc Cmd.Parameters.Add("@View_userID", SqlDbType.VarChar, 20).Value = strID Cmd.Parameters.Add("@outResult", SqlDbType.VarChar, 20).Direction = ParameterDirection.Output Try '執行存儲過程 Cmd.ExecuteNonQuery() Return Cmd.Parameters(1).Value() Catch e As Exception Return False End Try End Function |