前言
进行重构的时候,可能实现一个功能需要走好几遍七层,以我的为例,比如注册:注册之前先判断卡号是否存在,注册后需要往student表和user表中添加记录,注册的金额要同步到RechargeCard表中,这样的话需要走4遍7层,会有很多相似的代码,为了解决代码冗余的问题,故使用了存储过程。
过程详解
是什么
存储过程(StoredProcedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
怎么用
1.打开SQLServer→具体的数据库→可编程性→存储过程→右击新建存储过程:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <郝平平>
-- Create date: <2018-8-14>
-- Description: <注册时和数据库的交互>
-- =============================================
ALTER PROCEDURE [dbo].[Proc_Register]
-- Add the parameters for the stored procedure here 所需要的参数
@cardNo varchar(20),
@studentName varchar(20),
@sex char(10),
@department varchar(20),
@grade varchar(50),
@specialty varchar(50),
@balance numeric(10,2),
@UserID varchar(20),
@PWD varchar(20),
@RechargeCash numeric(10,2)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- 添加记录给Student表
insert into Student(cardNo,studentName,sex,department,grade,specialty,balance,UserID,state,Ischeck)values(@cardNo,@studentName,@sex,@department,@grade,@specialty,@balance,@UserID,'True','False')
--添加记录给User_Info表
insert into User_Info(UserID,PWD,Level,UserName,state)values(@cardNo,@PWD,'学生',@studentName,'True')
--添加记录给ReCharge表
insert into ReCharge(cardNo,RechargeCash,Balance,UseID,Ischeck)values(@cardNo,@RechargeCash,@RechargeCash,@UserID,'False')
END
存储过程写完之后,一定要执行一下,否则在D层使用的时候会找不到相应的存储过程。
2.在对应的D层使用对应的存储过程:
public class ReigsterDAL : IDAL.IRegister
{
public int RegisterCard(Entity.UserInfo userInfo)
{
SQLHelper SQLHelper = new SQLHelper();
//所用到的参数,与存储过程相对应
SqlParameter[] sqlParams = {new SqlParameter("@cardNo",userInfo.cardno),
new SqlParameter("@studentName",userInfo.UserName),
new SqlParameter("@sex",userInfo.Sex),
new SqlParameter("@department",userInfo.Department),
new SqlParameter("@grade",userInfo.Grade),
new SqlParameter("@specialty",userInfo.Specialty),
new SqlParameter("@balance",userInfo.Balance),
new SqlParameter("@UserID",userInfo.UserID),
new SqlParameter("@PWD",userInfo.Password),
new SqlParameter("@RechargeCash",userInfo.Rechargecash)};
string sql = "Proc_Register"; //存储过程名称
int res = SQLHelper.ExecuteNonQuery(sql, sqlParams, CommandType.StoredProcedure); //注意这里也是存储过程
return res;
}
}
3.这样一来存储过程就使用完了,走一遍7层可以实现走三遍7层的功能,是不是很完美呢?
优缺点
优点:重复使用,减少代码量;
缺点:如果数据库损坏,程序将无法运行;不可移植
总结
总之,小编很看好存储过程哦,因为目前我做的系统不存在移植的问题,使用存储过程可以提高我的开发效率,何乐而不为呢?