qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          SQL全局臨時表防止用戶重復登錄

            為了防止用戶的重復登錄,在一開始想到的一種方法:

            在用戶表中添加一個字段,登錄后寫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

          posted on 2013-07-04 10:27 順其自然EVO 閱讀(280) 評論(0)  編輯  收藏 所屬分類: 數據庫

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

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 罗甸县| 云霄县| 邯郸市| 慈利县| 辛集市| 裕民县| 株洲市| 木兰县| 沂南县| 自治县| 女性| 西乌珠穆沁旗| 和政县| 湾仔区| 定结县| 天峻县| 泾阳县| 黄平县| 陆河县| 镇远县| 长葛市| 临安市| 岫岩| 舞阳县| 枣阳市| 巨鹿县| 达日县| 渝中区| 安国市| 马鞍山市| 东城区| 萍乡市| 威宁| 杨浦区| 雅安市| 泊头市| 西乌珠穆沁旗| 思南县| 大同县| 蛟河市| 天峻县|