one:理論
a:定義
儲存過程(stored procedure)是一組為了完成特定功能的sql語句集合,經編譯後儲存在伺服器端的資料庫中,利用儲存過程可以加速sql語句的執行。
儲存過程分為系統儲存過程和自定義儲存過程。
1.系統儲存過程在master資料庫中,但是在其他的資料庫中可以直接呼叫,並且在呼叫時不必在儲存過程前加上資料庫名,因為在建立乙個新資料庫時,系統儲存過程
在新的資料庫中會自動建立
2.自定義儲存過程,由使用者建立並能完成某一特定功能的儲存過程,儲存過程既可以有引數又有返回值,但是它與函式不同,儲存過程的返回值只是指明執行是否成功,
並不能像函式那樣被直接呼叫,只能利用execute來執行儲存過程。
b:優點
1.提高應用程式的通用性和可移植性:儲存過程建立後,可以在程式中被多次呼叫,而不必重新編寫該儲存過程的sql語句。並且資料庫專業人員可以隨時對儲存過程進行
修改,且對程式源**沒有影響,這樣就極大的提高了程式的可移植性。
2.可以更有效的管理使用者運算元據庫的許可權:在sql server資料庫中,系統管理員可以通過對執行某一儲存過程的許可權進行限制,從而實現對相應的資料訪問進行控制,
避免非授權使用者對資料庫的訪問,保證資料的安全。
3.可以提高sql的速度,儲存過程是編譯過的,如果某乙個操作包含大量的sql**或分別被執行多次,那麼使用儲存過程比直接使用單條sql語句執行速度快的多。
4.減輕伺服器的負擔:當使用者的操作是針對資料庫物件的操作時,如果使用單條呼叫的方式,那麼網路上還必須傳輸大量的sql語句,如果使用儲存過程,
則直接傳送過程的呼叫命令即可,降低了網路的負擔。
c:語法
sql server儲存過程語法:
create procedure 過程名
@parameter 引數型別
@parameter 引數型別
。。。asbegin
end執行儲存過程:execute 過程名
two:應用
a:資料庫儲存
--查詢不帶引數的儲存過程
alter procedure [dbo].[getuser]asbegin
select theserialnumber, userid, username, userset,
userphone, work.userworktype,details.workdetailssituation,
[level].userleverltype,[type].usertype, usercreationtime, hobby.userhobbyfrom[user]
inner join work on work.userworkid=[user].userworkid
inner join [level] on [level].userlevelid=[user].userlevelid
inner join usertypeas [type] on [type].usertypeid=[user].usertypeid
inner join workdetailsas details on details.workdetailsid=work.workdetailsid
inner join userhobbyas hobby on hobby.userhobbyid=[user].userhobbyid
end--查詢帶引數的儲存過程
alter procedure [dbo].[getuserid]--建立儲存過程名
@userid varchar(50) --引數asbeginselect * from [user] where userid=@userid --命令列或者命令塊
endb:專案程式
//根據提供的strsql語句 訪問資料庫,返回list集合
public list getdataset(stringstrsql)
connection();tryreturnlist;
}catch(exception)
catch(exception ex)
///執行返回dataset的查詢/// 儲存過程名稱
/// 儲存過程引數
public static dataset getdatasetbyproc(string procname, paramsidataparameter parameters)
connection();
dataset ds= newdataset();
sqlcommand cmd= newsqlcommand();trycatch(exception ex)
catch(exception e)
console.write(sqlstr+ ",sql異常:" +e.message);
}finallyreturndt;#endregion}
c:呼叫
//、、、、、、、、儲存過程、、、、、、、、、//查詢全部
public static listgetuser()
{return db.getdataset("getuser");
///根據條件查詢///
/// 引數
public static datatable getuserid(stringuserid)
sqlparameter parameters={new sqlparameter("@userid",sqldbtype.varchar,50)
parameters[0].value =userid;return dbbase.getdatatablebyproc("getuserid", parameters);
//儲存過程
list u =dal.family.getuser();
datatable d= dal.family.getuserid("2020020901494949");for (int i = 0; i < d.rows.count; i++)
{foreach (datarow dr ind.rows)
{var id = dr["userid"].tostring();
EF 呼叫儲存過程
1.執行返回表型別的儲存過程 主表從表資料一起關聯查詢 alter proc dbo getcategory cidint asbegin select fromcategories where cid cid end 執行此儲存過程的 如下 public ienumerablegetcategor...
EF呼叫儲存過程
1 無引數查詢 var model db.database.sqlquery select from userinfoes tolist 2 有參查詢 var model db.database.sqlquery select from userinfoes where id id new sqlp...
EF框架呼叫儲存過程
新到的公司專案用ef mvc,開始接觸,遇到很多挫折,由於資料庫設計原因,很多地方都要用檢視 儲存過程來實現一些需求。呼叫儲存過程遇到了好多問題,這邊記錄一下幾種呼叫方式,及遇到的問題的解決方式。儲存過程 alter procedure sp name param1 int,param2 int,p...