現在存在很多企業級的資料庫,如Oracle,SqlServer等等,功能強大,使用方便,唯一的缺點是 佔用資源多,一般情況下,應該把一台電腦作為單獨的資料庫伺服器,這不是所有人都能做到的。如果把應用程式,資料庫裝在同一台電腦,效率會低一些的。
那麼使用簡單的資料庫工具可以解決這個問題,當然也可以使用其它解決方案,如xml檔案,不過這裡只討論常見的資料庫工具-Access。
本人使用Access的原因,基於處理一下問題:
伺服器系統管理使用者狀態,使用web.config設定,存在3種方式:
<SessionState>
mode="Off":關閉使用者Session管理;
mode="InProc":IIS系統管理使用者Session;
mode="StateServer":可以在其它運行AspState Service的Win2000機器上管理;
mode="SqlServer":使用SqlServer資料庫管理;
如果要維護使用者狀態,那麼最後3種方式可以使用,不論是“InProc”還是“StateServer”,都要佔用系統資源,對於少量資訊維護,可以勝任,對於大量資料維護,“InProc”方式力不從心,“StateServer”方式的擴充性不好。
用資料庫方式,可以管理海量資料,擴充性好,唯一不足是速度比其他稍慢。
微軟提供了使用SqlServer管理Session的方法,前台將web.config的SessionState中的mode設為“SqlSerer”,背景資料庫指令碼在/windows/Microsoft.NET\Framework\v1.0.3215\installsqlsate.sql獲得,2者配合,可以使用。
不過不是所有人都使用SqlServer的,對於其他資料庫,微軟沒有提供解決方案。微軟的資料庫指令碼檔案,我沒有仔細看,因為對SqlServer不熟悉。
根據對Session的理解,自己寫管理方法,資料庫為常見的Access。
使用Access後,總結幾點經驗:
1.雖然Access小巧,但是使用起來比操作大型資料庫,如Oracle, 麻煩的多,因為小巧的緣故吧。
2.Access的表中少用Date型欄位,因為使用Asp.net 不好操作,沒有找到對應的資料類型,解決辦法是改為字元型的,然後使用CDate()作轉換。
3.Access中可以使用預存程序(即查詢) ,沒有觸發器;
關於使用查詢:
使用的方法,同調用Oracle等大型資料庫的預存程序相同,如:
//Con是OleDbConnection執行個體
if(Con.State==ConnectionState.Closed)
{
Con.Open();
}
OleDbCommand Cmd=Con.CreateCommand();
Cmd.CommandType=CommandType.StoredProcedure;
Cmd.CommandText="CheckTimeout"; //CheckTimeout是視圖名
int count=Cmd.ExecuteNonQuery();
其中視圖CheckTimeout的代碼:
UPDATE UserSession SET UserSession.IfEndSession = 1
WHERE (((Now()-CDate([timeout]))>Minute(15)));
屬於沒有參數的,如果調用有參數的,Asp.Net 部分加入OleDbParameter,其他相同,
視圖的代碼可為:
PARAMETERS [PersonID] Short;
DELETE *
FROM PersonInfo
WHERE [PersonInfo].[PersonID]=[PersonID];
其中PersonId為參數。
還在測試Session管理的代碼,如果基本可用,將貼出來供大家討論。
Microsoft的產品,入手簡單,深入複雜,支援外部的簡單的是後台嚴謹的複雜,我們常在開發Asp.Net程式時使用Session,但是知道Ms怎樣處理Session的原理,恐怕知道的人不多,自己寫一個Session處理,協助自己理解Session。
如果一個系統中存在多個Web伺服器,那麼有一台伺服器作為Session伺服器,應該是分布式系統的一個好的選擇。
我想把我的想法作為一個開源項目,對此感興趣的所有人都可以閱讀,測試,為了方便測試,選擇了Access,如果此項目可用,那麼可以容易的應用到其他資料庫平台。
有了大家的協助,我們可以進步更快。
關於資料庫分類的概念,謝謝春魚。
附Access的介紹(從其他網站摘錄):
在辦公軟體Office套件中,最為廣大使用者熟悉的是Word和Excel,因為它們功能強大且方便易用,更因為它們不僅可用於辦公,還可用於個人寫作和家庭記帳理財等。同為Office套件中一部分的Access,雖然有著同樣強大的功能,但使用的人卻相對少些,不像Word和Excel那樣廣泛。事實上,真正用過Access的使用者,對其強大功能和靈活應用均稱讚“不錯,很好的……。”
Access 資料庫管理系統是Microsoft Office 套件的重要組成部分,是Access的最新版本,可在Windows 95環境下運行。Access適用於小型商務活動,用以存貯和管理商務活動所需要的資料。Access不僅是一個資料庫,而且它具有強大的資料管理功能,它可以方便地利用各種資料來源,產生表單(表單),查詢,報表和應用程式等。
什麼是Access 資料庫
資料庫是有結構的資料集合,它與一般的資料檔案不同,(其中的資料是無結構的)是一串文字或數字流。資料庫中的資料可以是文字、圖象、聲音等。
Microsoft Access是一種關係式資料庫,關係式資料庫由一系列表組成,表又由一系列行和列組成,每一行是一個記錄,每一列是一個欄位,每個欄位有一個欄位名,欄位名在一個表中不能重複。圖1是一個“產品”表的例子。“產品”表由10個記錄組成,一個記錄佔一行,每一個記錄由產品ID、產品名稱、庫存量、訂貨量、單價和折扣率6個欄位組成。“產品ID”是欄位名,其下面的1,2等是欄位的值。
表與表之間可以建立關係(或稱關聯,串連),以便查詢相關聯的資訊。Access資料庫以檔案形式儲存,檔案的副檔名是MDB。
Access 的6種對象
Access 資料庫由六種對象組成,它們是表、查詢、表單、報表、宏和模組。
表(Table) ——表是資料庫的基本對象,是建立其他5種對象的基礎。表由記錄組成,記錄由欄位組成,表用來存貯資料庫的資料,故又稱資料表。
查詢(Query)——查詢可以按索引快速尋找到需要的記錄,按要求篩選記錄並能串連若干個表的欄位組成新表。
表單(Form)——表單提供了一種方便的瀏覽、輸入及更改資料的視窗。還可以建立子表單顯示相關聯的表的內容。表單也稱表單。
報表(Report)——報表的功能是將資料庫中的資料分類匯總,然後列印出來,以便分析。
宏(Macro)——宏相當於DOS中的批處理,用來自動執行一系列操作。Access列出了一些常用的操作供使用者選擇,使用起來十分方便。
模組(Module)——模組的功能與宏類似,但它定義的操作比宏更精細和複雜,使用者可以根據自己的需要編寫程式。模組使用Visual Basic編程。
與Access 以前的版本比較,Access 新增了許多功能,欄位類型增加了OLE對象和超級連結,特別是與Internet的融合,在資料庫中可以直接連結到指定的Web頁面或網路檔案,也可以把Web頁面上的表格匯入到資料庫。Access 可以方便地利用各種資料來源,包括dBASE, FoxBase,FoxPro,Excel,Word 等。Access 增加了資料庫訪問的安全機制,可對錶一級設定訪問許可權。Access 還可以方便地利用FoxPro資料庫、Excel試算表的資料,還可以和Word混合使用,列印通用信函或信封。
MS ACCESS使用VBA語法來開發,在mdb的檔案格式中,提供資料與程式同時建置,或是利用資料庫分割,將程式與資料分隔,有
點類似主從架構,使用mdb最大的好處就是可以盡情使用ACCESS的參數,它可以節省寫SQL語法與過多的VBA程式,不過mdb的缺點
是比較適合單機作業,如果想多人使用資料庫,那麼就必須將資料轉換為SQL存取,只要分別在使用端設定ODBC來指向SQL SERVER
,這樣子就符合多人使用的目的與效果了!
在ACCESS 2000/XP中出現新的格式-ADP,ADP是直接連取SQL SERVER來做資料存取,速度當然比透過ODBC來的快,不過您必
須逐行撰寫 VBA與 SQL語法,在ACCESS 2000中必須安裝OFFICE 2000 SP1更新檔才可以直接存取SQL 2000,無論是MDB或ADP也
好,ACCESS最大的優點在於報表的製作,例如:做識別證,來賓證等,它簡單的報表設定,都是最具有親合力的操作,ACCESS的報表當
然也具有試算的能力,只要懂一點ACCESS的使用著都會自己調整報表列印位置,不必依賴程式設計者,給予使用者莫大的幫助。
瀏覽器訪問WebPage時,雖然使用的地址不變,但是連接埠會發生變化,用重新整理頁面作測試,2分鐘內重新整理,使用者的連接埠不變,超過2分鐘,那麼連接埠會發生變化。
Http1.1中說,Connection前序中有持久性串連控制,預設情況下,所有Http1.1串連都認為是持久性的,除非某個請求或者響應包括了一個Connection:close前序。這個持久性,指的好像不是維持相同的Tcp連接埠。
如果用Http協議維持會話,那麼需要給用戶端發送標記符SessionId,用戶端再次訪問時,提供這個標記,好被Server識別。這個標記存在形式是cookie或者查詢字串,要手工處理Session,需要一些功能來實現,帶來如下問題:
要實現Access儲存Session,那麼WebApp的設定檔的
<SessionState>
mode="Off":關閉使用者Session管理;
因為不瞭解IIS的Session管理機制。
那就需要知道怎樣處理標記使用者請求的SessionID,關於SessionId還在查資料,那位對此有經驗,請給與支援。
SessionID:msdn中說,是長度為120Bit的ASC字元,可以在Url中使用,但是經過測試, //產生SessionId
string id=Session.SessionID;
//顯示Id的內容及長度
Response.Write(id+":"+id.Length.ToString()+"<br>");
byte[] by=System.Text.Encoding.ASCII.GetBytes(id);
Response.Write(by.Length.ToString()+"<br>");
使用Session.SessionID產生的SessionId長度為24個ASC字元,即192Bit,應該是原始的SessionID被加密了,長度發生了變化。