摘 要: 存儲(chǔ)過(guò)程是數(shù)據(jù)庫(kù)端執(zhí)行的一組T-SQL語(yǔ)句的集合。網(wǎng)上商城系統(tǒng)具有大量的用戶交互的特點(diǎn),系統(tǒng)性能十分重要。文章介紹了網(wǎng)上商城系統(tǒng)的主要功能及數(shù)據(jù)庫(kù)設(shè)計(jì),具體闡述了存儲(chǔ)過(guò)程在該系統(tǒng)開(kāi)發(fā)中的應(yīng)用。實(shí)踐結(jié)果表明,使用存儲(chǔ)過(guò)程能夠提高系統(tǒng)運(yùn)行的效率,增強(qiáng)系統(tǒng)的安全性。
關(guān)鍵詞: 存儲(chǔ)過(guò)程; 網(wǎng)上商城; 安全性; SQL Server
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):1006-8228(2013)09-31-03
0 引言
目前國(guó)內(nèi)B2C行業(yè)正處于高速成長(zhǎng)期,市場(chǎng)的進(jìn)一步擴(kuò)張為傳統(tǒng)企業(yè)電子商務(wù)化提供了一個(gè)發(fā)展的平臺(tái),建立自己的B2C網(wǎng)上商城正成為未來(lái)中小企業(yè)進(jìn)行網(wǎng)上開(kāi)拓市場(chǎng)的渠道選擇[1]。網(wǎng)上商城系統(tǒng)與一般網(wǎng)站的主要區(qū)別之一是系統(tǒng)要求更多的交互,更安全地進(jìn)行數(shù)據(jù)存儲(chǔ)和交換,因此網(wǎng)站的運(yùn)行效率及安全性是網(wǎng)站設(shè)計(jì)的關(guān)鍵。存儲(chǔ)過(guò)程是數(shù)據(jù)庫(kù)管理系統(tǒng)中一類常用的數(shù)據(jù)庫(kù)對(duì)象,具有可模塊化編程、執(zhí)行效率高、可減輕網(wǎng)絡(luò)負(fù)載及訪問(wèn)安全可靠等特點(diǎn)。在網(wǎng)上商城系統(tǒng)中使用該對(duì)象,可以提高網(wǎng)站的訪問(wèn)速度和安全性,為用戶提供更好的購(gòu)物體驗(yàn)。
1 網(wǎng)上商城系統(tǒng)
1.1 網(wǎng)上商城系統(tǒng)的基本功能
網(wǎng)上商城系統(tǒng)要為用戶建立一個(gè)動(dòng)態(tài)的、便捷的、交互性的網(wǎng)絡(luò)購(gòu)物環(huán)境,實(shí)際上是一個(gè)B/S結(jié)構(gòu)的信息系統(tǒng)[2]。它主要有兩類用戶,即普通用戶和管理員。整個(gè)系統(tǒng)可以分為前臺(tái)和后臺(tái)兩個(gè)部分,前臺(tái)主要是面向普通用戶的,主要由商品瀏覽、商品查詢、購(gòu)物車、會(huì)員管理等模塊組成,后臺(tái)是面向管理員的,主要包括登錄管理、商品管理、會(huì)員管理、訂單管理、公告管理等模塊構(gòu)成。后臺(tái)功能模塊如圖1所示。
1.2 網(wǎng)上商城系統(tǒng)的邏輯體系設(shè)計(jì)
網(wǎng)上商城系統(tǒng)采用Microsoft Visual Studio 2010開(kāi)發(fā),后臺(tái)數(shù)據(jù)庫(kù)采用SQL Server 2008。該系統(tǒng)使用三層體系結(jié)構(gòu),整個(gè)系統(tǒng)分為表示層、業(yè)務(wù)邏輯層、數(shù)據(jù)訪問(wèn)層,如圖2所示。該系統(tǒng)的數(shù)據(jù)訪問(wèn)層實(shí)現(xiàn)時(shí)調(diào)用了事先在數(shù)據(jù)庫(kù)后臺(tái)編制的各類存儲(chǔ)過(guò)程,從而提高了系統(tǒng)的運(yùn)行效率,保證了系統(tǒng)的安全性。
1.3 網(wǎng)上商城系統(tǒng)的數(shù)據(jù)庫(kù)設(shè)計(jì)
根據(jù)系統(tǒng)的功能需求,設(shè)計(jì)出了以下數(shù)據(jù)庫(kù)關(guān)系模式:
⑴ 商品信息(商品編號(hào),類別編號(hào),商品名稱,商品介紹,進(jìn)貨價(jià)格,商品圖片,進(jìn)貨日期,備注);
⑵ 商品類別(類別編號(hào),類別名稱);
⑶ 訂單信息(訂單編號(hào),用戶名,付款方式,運(yùn)送方式,訂貨日期,是否執(zhí)行,備注);
⑷ 訂單明細(xì)(訂單明細(xì)編號(hào),訂單編號(hào),商品編號(hào),價(jià)格,數(shù)量);
⑸ 會(huì)員信息(會(huì)員編號(hào),用戶名,密碼,真實(shí)姓名,地址,郵政編碼,電話,電子郵件);
⑹ 管理員(用戶編號(hào),用戶名,密碼)。
2 存儲(chǔ)過(guò)程及其優(yōu)點(diǎn)
存儲(chǔ)過(guò)程是一種重要的數(shù)據(jù)庫(kù)對(duì)象,是為了實(shí)現(xiàn)某種特定的功能,將一組預(yù)編譯的SQL語(yǔ)句以存儲(chǔ)單元的形式存儲(chǔ)在服務(wù)器上,供用戶調(diào)用[3]。存儲(chǔ)過(guò)程可以帶輸入?yún)?shù)、輸出參數(shù),具有返回值。SQL Server支持五種類型的存儲(chǔ)過(guò)程,分別是:系統(tǒng)存儲(chǔ)過(guò)程、本地存儲(chǔ)過(guò)程、臨時(shí)存儲(chǔ)過(guò)程、遠(yuǎn)程存儲(chǔ)過(guò)程和擴(kuò)展存儲(chǔ)過(guò)程。
存儲(chǔ)過(guò)程具有以下優(yōu)點(diǎn)。
⑴ 執(zhí)行效率高 存儲(chǔ)過(guò)程在創(chuàng)建時(shí)就經(jīng)過(guò)了語(yǔ)法檢查和性能優(yōu)化,因此在執(zhí)行時(shí)不必再重復(fù)這些步驟。存儲(chǔ)過(guò)程第一次調(diào)用后,就駐留在內(nèi)存中,不必再經(jīng)過(guò)編譯和優(yōu)化,所以執(zhí)行速度很快。
⑵ 提高軟件系統(tǒng)的可維護(hù)性 存儲(chǔ)過(guò)程將相關(guān)業(yè)務(wù)邏輯封裝在一起,只要?jiǎng)?chuàng)建一次,便可多次調(diào)用。用戶可以獨(dú)立于應(yīng)用程序而對(duì)存儲(chǔ)過(guò)程進(jìn)行修改[4]。
⑶ 降低網(wǎng)絡(luò)流量 存儲(chǔ)過(guò)程位于服務(wù)器上,調(diào)用的時(shí)候只需要傳遞存儲(chǔ)過(guò)程的名稱和參數(shù),因此降低了網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量[5]。
⑷ 保證系統(tǒng)的安全 存儲(chǔ)過(guò)程可以避免用戶在應(yīng)用程序中直接嵌入SQL語(yǔ)句,防止SQL注入攻擊;可以在數(shù)據(jù)庫(kù)內(nèi)分別設(shè)置各個(gè)存儲(chǔ)過(guò)程的安全保護(hù)[6],即為存儲(chǔ)過(guò)程設(shè)置一定的調(diào)用權(quán)限,從而避免用戶越權(quán)訪問(wèn),保證信息系統(tǒng)的安全。
3 存儲(chǔ)過(guò)程在網(wǎng)上商城系統(tǒng)中的應(yīng)用
3.1 網(wǎng)上商城系統(tǒng)中的部分存儲(chǔ)過(guò)程
SQL Server中創(chuàng)建存儲(chǔ)過(guò)程時(shí)需要指定存儲(chǔ)過(guò)程的名稱、輸入?yún)?shù)、輸出參數(shù)等,在網(wǎng)上商城系統(tǒng)中,服務(wù)器端創(chuàng)建了實(shí)現(xiàn)登錄驗(yàn)證、數(shù)據(jù)操作(增、刪、改、查)、數(shù)據(jù)分頁(yè)等存儲(chǔ)過(guò)程,大大提高了應(yīng)用程序訪問(wèn)數(shù)據(jù)庫(kù)的效率,具體如下。
3.1.1 實(shí)現(xiàn)登錄驗(yàn)證的存儲(chǔ)過(guò)程
登錄存儲(chǔ)過(guò)程proc_Login主要用來(lái)驗(yàn)證用戶名和密碼的合法性?;诖鎯?chǔ)過(guò)程的優(yōu)點(diǎn),可以運(yùn)用它實(shí)現(xiàn)登錄功能從而防御SQL的注入攻擊,提高系統(tǒng)的安全性。另外,可以使用“WITH ENCRYPTION”語(yǔ)句對(duì)存儲(chǔ)過(guò)程的創(chuàng)建過(guò)程進(jìn)行加密,具體代碼如下。
CREATE PROC proc_Login
@UserName VARCHAR(20), --輸入?yún)?shù)用戶名
@Pwd VARCHAR(20), --輸入?yún)?shù)密碼
@Return BIT OUTPUT --輸出參數(shù),登錄結(jié)果
WITH ENCRYPTION
AS
BEGIN
IF EXISTS(SELECT COUNT(*)
FROM Admin
WHERE UserName=@UserName AND Pwd=@Pwd)
SET @Return=1 --驗(yàn)證成功
ELSE
SET @Return=0 --驗(yàn)證失敗
END
3.1.2 增加商品的存儲(chǔ)過(guò)程
網(wǎng)上商城系統(tǒng)中包括許多對(duì)數(shù)據(jù)表進(jìn)行增加、刪除、修改或查詢的操作,這些都可以使用存儲(chǔ)過(guò)程來(lái)實(shí)現(xiàn),從而提高系統(tǒng)的可維護(hù)性。這里以增加商品來(lái)展示此類存儲(chǔ)過(guò)程的實(shí)現(xiàn),其他功能只需將存儲(chǔ)過(guò)程中的INSERT語(yǔ)句改成相應(yīng)功能的語(yǔ)句即可。下面的存儲(chǔ)過(guò)程共包括七個(gè)輸入?yún)?shù),主要功能是實(shí)現(xiàn)商品信息的添加,具體代碼如下。
CREATE PROCEDURE proc_InsertProduct
@typeID INT, --類別編號(hào)
@goodsName VARCHAR(200), --商品名稱
@introduce TEXT, --商品介紹
@price FLOAT, --進(jìn)貨價(jià)格
@picture VARCHAR(100), --商品圖片
@INTime DATETIME, --進(jìn)貨日期
@remarks TEXT --備注
AS
BEGIN
INSERT INTO product
(typeID,goodsName,introduce,price,picture,INTime,remarks)
VALUES
(@typeID,@goodsName,@introduce,@price,@picture,
@INTime,@remarks)
END
3.1.3 實(shí)現(xiàn)分頁(yè)的存儲(chǔ)過(guò)程
經(jīng)典的數(shù)據(jù)分頁(yè)方法是ADO記錄集分頁(yè)法,也就是利用ADO自帶的分頁(yè)功能來(lái)實(shí)現(xiàn)分頁(yè),但這種分頁(yè)方法僅適用于數(shù)據(jù)量較小的情形,而不適合網(wǎng)上商城這類系統(tǒng)。由于存儲(chǔ)過(guò)程是事先編譯好的SQL語(yǔ)句,它的執(zhí)行效率要比通過(guò)Web頁(yè)面?zhèn)鱽?lái)的SQL語(yǔ)句的執(zhí)行效率要高,因此在數(shù)據(jù)庫(kù)端編寫(xiě)實(shí)現(xiàn)分頁(yè)的存儲(chǔ)過(guò)程很有必要,可以使用戶有較好的訪問(wèn)體驗(yàn)。實(shí)現(xiàn)通用的分頁(yè)功能,存儲(chǔ)過(guò)程設(shè)計(jì)時(shí)可以包括數(shù)據(jù)表名、需要返回的列、排序的字段名、頁(yè)尺寸、頁(yè)碼、返回的記錄總數(shù)等多個(gè)輸入?yún)?shù),由于本文篇幅有限,代碼此處就不列出了。
3.2 存儲(chǔ)過(guò)程在.NET程序中的調(diào)用
.NET程序中要訪問(wèn)數(shù)據(jù)庫(kù)及數(shù)據(jù)庫(kù)對(duì)象,首先,要定義ADO.NET的SqlConnection對(duì)象,并利用該對(duì)象打開(kāi)與數(shù)據(jù)庫(kù)的連接;其次,需要?jiǎng)?chuàng)建一個(gè)SqlCommand對(duì)象,并指定該對(duì)象的類型為存儲(chǔ)過(guò)程;如果該存儲(chǔ)過(guò)程有輸入?yún)?shù)或者輸出參數(shù),還需要依次在command對(duì)象的Parameters集合中通過(guò)Add()方法逐個(gè)添加參數(shù),并將參數(shù)的值傳入或傳出;然后,通過(guò)Command對(duì)象的ExecuteNonQurey()、ExecuteReader()、ExecuteScalar()等方法調(diào)用存儲(chǔ)過(guò)程,將增加、刪除、修改的數(shù)據(jù)插入到數(shù)據(jù)庫(kù)中,或者是將數(shù)據(jù)返回到.NET程序中;最后,關(guān)閉數(shù)據(jù)庫(kù)連接。下面以增加商品的存儲(chǔ)過(guò)程proc_InsertProduct為例,列出其在.NET中編寫(xiě)的關(guān)鍵代碼:
//創(chuàng)建與數(shù)據(jù)庫(kù)的連接
string connString="Data Source=.;Initial Catalog=test;
User Id=Admin;Pwd=admin";
SqlConnection conn=new SqlConnection(connString);
try
{ string sql="proc_InsertProduct";
//打開(kāi)數(shù)據(jù)庫(kù)連接
conn.Open();
//創(chuàng)建SqlCommand對(duì)象,并指定其類型是存儲(chǔ)過(guò)程
SqlCommand command=new SqlCommand(sql, conn);
command.CommandType=CommandType.StoredProcedure;
//逐一添加輸入?yún)?shù),商品類別、商品名稱等
command.Parameters.Add("@typeID", SqlDbType.Int);
command.Parameters["@typeID"].Value
=Convert.ToInt16(txtTypeID.Text);
command.Parameters.Add("@goodsName",SqlDbType.VarChar);
command.Parameters["@goodsName"].Value
=txtgoodsName.Text;
……字段較多,此處不一一列出
command.Parameters.Add("@remarks", SqlDbType.Text);
command.Parameters["@remarks"].Value=txtremarks.Text;
//可調(diào)用Sqlcommand的不同方法來(lái)執(zhí)行查詢或者是增、刪、改的動(dòng)作
command.ExecuteNonQuery();
string message="";
……根據(jù)返回值判斷操作是否成功,此處略
MessageBox.Show(message);
}
catch (Exception ex)
{ MessageBox.Show("系統(tǒng)發(fā)生錯(cuò)誤");
}
finally
{ //關(guān)閉數(shù)據(jù)庫(kù)連接
conn.Close();
}
4 結(jié)束語(yǔ)
數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)開(kāi)發(fā)中,將易于變化或進(jìn)行數(shù)據(jù)庫(kù)處理的功能用存儲(chǔ)過(guò)程編寫(xiě),可以給開(kāi)發(fā)及后期的軟件維護(hù)帶來(lái)諸多方便。但是存儲(chǔ)過(guò)程的使用不當(dāng)也會(huì)增加服務(wù)器的負(fù)擔(dān),因此需要結(jié)合實(shí)際工作合理使用。筆者在網(wǎng)上商城系統(tǒng)的開(kāi)發(fā)過(guò)程中充分利用了SQL Server存儲(chǔ)過(guò)程,不僅大大減少了程序開(kāi)發(fā)的工作量,而且提高了系統(tǒng)的性能和穩(wěn)定性。
參考文獻(xiàn):
[1] 李俊.基于Asp.net的B2C電子商務(wù)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].重慶大學(xué)碩士學(xué)位論文,2012.
[2] 歐陽(yáng)昉.網(wǎng)上商城購(gòu)物系統(tǒng)研究與開(kāi)發(fā)[D].電子科技大學(xué)碩士學(xué)位論文,2007.
[3] 吳伶琳,楊正校.SQL Server 2005數(shù)據(jù)庫(kù)基礎(chǔ)[M].大連理工大學(xué)出版社,2010.
[4] 李春芬,吳英斌.存儲(chǔ)過(guò)程在勘探設(shè)備管理系統(tǒng)中的應(yīng)用[J].物探裝備,2011.21(5):327-330
[5] 陳曉丹,王娟.存儲(chǔ)過(guò)程在信息發(fā)布系統(tǒng)中的研究與應(yīng)用[J].武漢工程職業(yè)技術(shù)學(xué)院學(xué)報(bào),2010.22(2):36-38
[6] 張小波,成良玉.vs.net中存儲(chǔ)過(guò)程使用方法研究[J].計(jì)算機(jī)應(yīng)用,2004.24(2):138-140