qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問 http://qaseven.github.io/

          SQL全局臨時(shí)表防止用戶重復(fù)登錄

            為了防止用戶的重復(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

          posted on 2013-07-04 10:27 順其自然EVO 閱讀(282) 評(píng)論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫(kù)

          <2013年7月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 稻城县| 松江区| 龙州县| 勃利县| 巴马| 普宁市| 庆云县| 阿荣旗| 正蓝旗| 澎湖县| 乌兰浩特市| 鄂尔多斯市| 军事| 车险| 黑河市| 桃园市| 大化| 平原县| 浮梁县| 开封市| 卢氏县| 桐乡市| 涿州市| 库尔勒市| 望谟县| 南陵县| 东丽区| 姜堰市| 灵台县| 宜城市| 兴隆县| 云和县| 新丰县| 瓦房店市| 湖南省| 洱源县| 平顺县| 垣曲县| 嘉峪关市| 哈尔滨市| 大方县|