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