魏宏昌 王英杰 梁曉強(qiáng) 王志娟 張朝亮
摘 要:數(shù)據(jù)是軟件的重要組成部分,特別是在B/S系統(tǒng)中數(shù)據(jù)庫訪問是一個(gè)讀寫數(shù)據(jù)操作很重要的部分,而通過存儲過程實(shí)現(xiàn)數(shù)據(jù)庫訪問是很多軟件使用的方法。本文介紹ASP.NET 數(shù)據(jù)庫應(yīng)用程序調(diào)用SQL Server數(shù)據(jù)庫管理系統(tǒng)中的存儲過程的方法,以及使用存儲過程的優(yōu)勢和注意事項(xiàng)。
關(guān)鍵詞:存儲過程;數(shù)據(jù)庫;應(yīng)用
1 前言
SQL Server數(shù)據(jù)庫管理系統(tǒng)是目前最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,主要包括數(shù)據(jù)庫、表、視圖,還有函數(shù)、存儲過程、觸發(fā)器等可編程性對象。那什么是存儲過程呢?存儲過程可以說是一個(gè)記錄集,它是由一些T-SQL語句組成的代碼塊,這些T-SQL語句代碼就像C#中的一個(gè)方法一樣,實(shí)現(xiàn)一些功能比如對單表或多表的增刪改查。
在SQL Server數(shù)據(jù)庫管理系統(tǒng)中容易混淆的有函數(shù)和存儲過程兩個(gè)對象,它們兩個(gè)其實(shí)還是有很大區(qū)別的,主要體現(xiàn)在以下幾點(diǎn):
(1)一般來說,存儲過程的功能要復(fù)雜一點(diǎn),而函數(shù)是簡短而有針對性的。
(2)存儲過程可借助output返回參數(shù),而函數(shù)只能返回值或者數(shù)據(jù)集。
(3)存儲過程是作為一個(gè)獨(dú)立的部分來執(zhí)行,而函數(shù)可以作為Select語句的一部分,由于函數(shù)可以返回一個(gè)數(shù)據(jù)集,因此函數(shù)可以在查詢語句中位于FROM關(guān)鍵字的后面,存儲過程則不能。
2 存儲過程的優(yōu)點(diǎn)
存儲過程作為SQL Server數(shù)據(jù)庫管理系統(tǒng)的重要對象,提供了許多標(biāo)準(zhǔn)SQL語言中所沒有的高級特性,主要表現(xiàn)在以下幾個(gè)方面:
(1)執(zhí)行速度更快。
(2)允許模塊化程序設(shè)計(jì)。
(3)提高系統(tǒng)安全性。
(4)減少網(wǎng)絡(luò)流通量。
3 存儲過程的分類
存儲過程大致分為以下這些分類:沒有輸入輸出的存儲過程、有返回值的存儲過程、只返回單一記錄集的存儲過程、返回多個(gè)記錄集的存儲過程、有輸入?yún)?shù)和輸出參數(shù)的存儲過程、同時(shí)具有返回值和輸入與輸出參數(shù)的存儲過程、同時(shí)有返回值和記錄集的存儲過程。
下面我們以SQL Server自帶的Northwind數(shù)據(jù)庫為例,定義一個(gè)添加區(qū)域名稱操作,并返回這個(gè)操作影響的行數(shù),同時(shí)還要獲取新添加的區(qū)域名的ID以及所有區(qū)域名的記錄集。定義存儲過程的SQL語句:
CREATE PROCEDURE uspRegion @regionId int output,@regionDescription nchar(50)
AS insert into Region(RegionDescription)values(@regionDescription)
set @regionId = @@IDENTITY select * from Region return @@rowcount
4 在ASP.NET程序里調(diào)用存儲過程
要訪問數(shù)據(jù)庫就要用到ADO.NET去操作,使用其中的Connection對象連接數(shù)據(jù)庫,再使用Command對象執(zhí)行SQL語句或存儲過程,返回值和輸出參數(shù)都要使用Command對象獲得,如果有返回的數(shù)據(jù)集,還要使用DataAdapter對象將數(shù)據(jù)集填充到DataSet對象里。
我們使用上面定義的存儲過程,使用ASP.NET執(zhí)行添加區(qū)域名操作,我們先創(chuàng)建一個(gè)ASP.NET頁面,用一個(gè)名為txtDesc的文本框控件作為區(qū)域名的輸入,用名為gvRegion的數(shù)據(jù)表格控件顯示所有區(qū)域信息,用名為lblInfo的標(biāo)簽控件顯示添加操作的結(jié)果和新區(qū)域名的ID。提交按鈕的后臺代碼如下:
SqlCommand cmd = new SqlCommand();cmd.Connection = conn;cmd.CommandText = “ uspRegion “;
cmd.CommandType = CommandType.StoredProcedure;
IDataParameter[] pa = {new SqlParameter(“@regionId”,SqlDbType.Int,4),
new SqlParameter(“@regionDescription”,SqlDbType.NChar,50),new SqlParameter(“val”,SqlDbType.Int,4)};
pa[0].Direction = ParameterDirection.Output;pa[1].Value = txtDesc.Text;
ps[2].Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(pa[0]);cmd.Parameters.Add(pa[1]);cmd.Parameters.Add(pa[2]);
SqlDataAdapter da = new SqlDataAdapter(cmd);DataSet ds = new DataSet();da.Fill(ds);
gvRegion.DataSource = ds.Tables[0];gvRegion.DataBind();
lblInfo.Text = “操作行:" +pa[2].Value.ToString()+ ",新ID為" + pa[0].Value.ToString();
5 結(jié)語
本文討論了SQL Server中的存儲過程的概念、分類和優(yōu)缺點(diǎn),并通過一個(gè)實(shí)例和代碼描述了在ASP.NET程序里調(diào)用帶輸入輸出參數(shù)已經(jīng)返回?cái)?shù)據(jù)集的存儲過程。從中我們發(fā)現(xiàn),通過使用存儲過程,可以提高數(shù)據(jù)的獨(dú)立性和邏輯性,還能提高程序的安全性與可擴(kuò)展性。
參考文獻(xiàn)
[1]周慧,施樂軍.數(shù)據(jù)庫技術(shù)及應(yīng)用[M].人民郵電出版社,2015.
[2]高宏.ASP.NET典型模塊與項(xiàng)目實(shí)戰(zhàn)大全[M].清華大學(xué)出版社,2014.
(作者單位:石家莊信息工程職業(yè)學(xué)院)