熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

用SQL Server保持會話狀態

2013-11-15 14:33:05  來源: SQL Server 

  在調用服務器後要繼續在服務器中保留數據通常很難你可以用SQL Server來進行會話狀態管理(用戶會話數據)以下教你怎樣用它來進行管理
  
  在頁面開發中在服務器調用裡保留數據是一個常見的不好解決的難題你也許需要為你的應用程序或特殊用戶的會話保存信息存儲這樣的數據被稱為狀態管理ASPNET為你提供了一些方法這些方法能讓你通過各種途徑完成這一任務這包括將數據存儲在一個狀態服務器的內存中或者通過Microsoft SQL服務器本文主要討論了用SQL服務器來進行會話狀態管理(用戶會話數據)
  
  為什麼需要進行狀態管理?
  
  在設置和使用SQL Server之前你也許會想有必要這樣做嗎?頁面開發還有更讓人煩惱的一面那就是HTTP是一項無狀態協議它的運行是斷斷續續的每個頁面都會按接受到的命令運行命令執行完以後所有用過的數據都會丟失服務器不會存儲關於那些調用的任何記憶也就是說它不會存儲相關記憶除非有特殊的指令讓它存儲
  
  會話變量
  
  以下是使用會話變量的格式
  
  C#: Session[variable_name] = value;
  VBNET: Session(variable_name) = value
  
  當這個值被存儲了用戶就可以在整個會話中使用它了會話結束後變量也就丟失了你也可以使用回歸狀態管理(這是我們下一次要討論的話題)來處理這些丟失的值
  
  ASPNET狀態管理
  
  ASPNET允許你通過一個狀態服務器或SQL服務器將會話數據存儲在內存中存儲的位置由應用程序的頁面配置文件來決定狀態管理選項是在系統中的sessionState元素中頁面元素是在狀態管理中進行設置的以下的示例顯示了怎樣使用SQL Server
  <sessionState
  mode=SQLServer
  stateConnectionString=tcpip=:
  sqlConnectionString=data source=;user id=username;password=password
  cookieless=false
  timeout= />
  
  注意這些元素的名稱和屬性都要區分大小寫以下是該模式屬性的各種可能值
  
  InProc存儲在內存中它的運行速度最快但是當ASPNET程序重復運行的時候所有的數據都會丟失
  
  SQL Server將數據存儲在SQL Server中由於它與頁面服務器是分離的因此它是最可信的連接字符串會按照正常的順序排列以連接到SQL Server數據庫中
  
  StateServer將數據存儲在一個獨立的頁面服務器上(IIS)這一選項利用了stateConnectionString這一屬性
  
  所有的選項都使用保留 cookieless屬性會告知用戶那些cookies是被存儲在內存(虛擬的)中還是保留在Querystring/URL(真實的)中timeout屬性則會告知用戶會話變量被存儲的時間(沒有接受任何命令)的長短
  
  設置 SQL Server
  
  SQL Server需要一個特殊的數據庫來進行狀態管理幸好NET Framework安裝包括了必備的文件這些文件可以讓它啟動並立即運行以下的腳本都安裝了
  
  InstallPersistSqlStatesql包括建立數據庫的腳本這個數據庫是持久狀態管理中要用到的
  
  UninstallPersistSqlStatesql包括卸載持久狀態管理的腳本
  
  UninstallSqlStatesql包括卸載狀態管理的腳本
  
  這些腳本可能會從Query Analyzer中或通過使用isqlexe命令來運行要進行狀態管理的話需要運行InstallSqlStatesql腳本的結果是由一個名為ASPState的數據庫創建出來的它會處理會話變量的存儲和保留問題你可以通過一個簡單的例子來測試其功能性
  
  下面的C#例子包括了將一個含有會話變量的頁面格式變成另一種可以顯示值的頁面格式
  <%@ Page language=c# %>
  
  <!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN >
  
  <HTML><HEAD>
  
  <title>WebForm</title>
  
  <meta name=GENERATOR Content=Microsoft Visual Studio NET >
  
  <meta name=CODE_LANGUAGE Content=C#>
  
  </HEAD>
  
  <body MS_POSITIONING=GridLayout>
  
  <script language=C# runat=server>
  
  private void Page_Load(object sender SystemEventArgs e) {
  
  Session[FirstName] = Tony;
  
  Session[LastName] = Patton;
  
  Session[Site] = ;
  
  ResponseRedirect(WebFormaspx true);
  
  }
  
  </script></body></HTML>
  
  Heres the second Web form:
  
  <%@ Page language=c# %>
  
  <!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN >
  
  <HTML><HEAD><title>WebForm</title></HEAD>
  
  <body>
  
  <script language=C# runat=server>
  
  private readonly string newLine = <br>;
  
  private void Page_Load(object sender SystemEventArgs e) {
  
  ResponseWrite(Session[FirstName]ToString() + );
  
  ResponseWrite(Session[LastName]ToString() + newLine);
  
  ResponseWrite(Session[Site]ToString() + newLine);
  
  }
  
  </script></body></HTML>
  
  如果你是用VBNET 進行開發頁面的格式就是下面這樣的
  <%@ Page Language=vb %>
  
  <!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN>
  
  <html><head>
  
  <title>WebForm</title></head><body>
  
  <script language=vb runat=server>
  
  Private Sub Page_Load(sender As Object e As SystemEventArgs)
  
  Session(FirstName) = Tony
  
  Session(LastName) = Patton
  
  Session(Site) =
  
  ResponseRedirect(WebFormaspx true)
  
  End Sub
  
  </script></body></html>
  
  Heres the Page_Load event on the second form:
  
  <%@ Page Language=vb %>
  
  <!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN>
  
  <html><head>
  
  <title>WebForm</title></head><body>
  
  <script language=vb runat=server>
  
  Private ReadOnly newLine As String = <br>
  
  Private Sub Page_Load(sender As Object e As SystemEventArgs)
  
  ResponseWrite(Session(FirstName)ToString() + )
  
  ResponseWrite(Session(LastName)ToString() + newLine)
  
  ResponseWrite(Session(Site)ToString() + newLine)
  
  End Sub
  
  </script></body></html>
  
  關於卸載狀態管理功能的一個注釋微軟建議在執行卸載腳本以前先取消World Wide Web Publishing服務你可以在命令行輸入net stop wsvc命令來完成這一步你可以用net start wsvc命令重啟機器
  
  你可以在SQL Server中檢測tempdb數據庫這樣你就可以毫不費力地看到會話管理屬性是怎樣運行的它使用兩個臨時表格來進行會話管理ASPStateTempApplications和 ASPStateTempSessions
  
  一種可行的選擇
  
  如果你擔心會由於 Web服務器停止運行而失去會話狀態數據的話SQL Server是一種很好的選擇不過由於數據庫的交互作用它的性能也許會受些影響但是它還是最值得的信賴的而又可行的方法
From:http://tw.wingwit.com/Article/program/SQLServer/201311/21981.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.