在师哥师姐验收的时候,就听过存储过程和触发器了。在个人重构好多地方也用到了存储过程。存储过程和触发器是两个重要的数据库对象,触发器是一种特殊类型的存储过程,在这里主要是介绍一下存储过程的应用。
什么是存储过程?
存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库
中。存储过程可包含程序流、逻辑及对数据库的查询。他们可以接受参数、输出参数、返回单个或多个结果集或返回值。
个人理解:存储过程就是可以对多个表同时进行操作,数据库的增删改可以并发进行。以注册为例,我们在插入学生信息的同时,也要在卡号和充值表中进行数据的更新。在充值的时候,我们可以完成对卡表钱总额的更新。
存储过程的优点
确保了数据放访问和修改的一致性,存储过程可以封装业务功能。
存储过程提供了安全机制。即使没有访问存储过程引用的表或者视图的权限的用户也可以被授权执行该存储过程。
存储过程可以减少网络通信流量,允许模块化程序设计,改进应用程序的可维护性。
存储过程的创建
以注册为例对存储过程进行讲解
在数据库中新建查询
USE 自己的数据库名称
Go
CREATE PROCEDURE pro_Register(存储过程的名称)
/***学生表、注册表、充值表所需要的所有参数****/
@cardNo varchar(14),@userNo varchar(14),
@money smallmoney,@type varchar(8),
@EnrollDate date,@EnrollTime time(0),
@status varchar(8),@userNo varchar(14),
@studentNo varchar(14),@cardNo varchar(14),
@stuName varchar(8),@stuSex varchar(2),
@stuInstitution varchar(14),@stuDeparment varchar(14),
@stuGrade varchar(14),@stuClass varchar(14),
@type varchar(8),@Date date,
@Time time(0),@status varchar(8),
@explain varchar(8),@addMoney smallmoney
as
begin
SET NOCOUNT ON;
Insert into T_StudentInfo(studentNo,cardNo,stuName,stuSex,stuInstitution,stuDeparment,stuGrade,stuClass) values(@studentNo,@cardNo,@stuName,@stuSex,@stuInstitution,@stuDeparment,@stuGrade,@stuClass)
Insert into T_EnrollCard(cardNo,userNo,addMoney,type,Date,Time,status,explain) values(@cardNo,@userNo,@Addmoney,@type,@Date,@Time,@status,@explain)
Insert into T_ChargeMoney(cardNo,userNo,addMoney,Date,Time,status)values(@cardNo,@userNo,@addMoney,@Date,@Time,@status)
end
在D层代码
public bool enroll(Register register, cardInfo card)
{
bool flag = false;//学号
SqlParameter[] pars = new SqlParameter[]
{
new SqlParameter("@studentNo",register.StuNo),
new SqlParameter("@cardNo",register.CardNo),
new SqlParameter ("@stuName",register.StuName),
new SqlParameter("@stuSex",register.StuSex),
new SqlParameter("@stuInstitution",register.stuInstitution),
new SqlParameter("@stuDeparment",register.StuDeparment),
new SqlParameter("@stuGrade",register.stuGrade),
new SqlParameter ("@stuClass",register.stuClass),
new SqlParameter("@Addmoney",card.stuMoney),
new SqlParameter ("@type",card.stuType),
new SqlParameter("@Date",Convert.ToDateTime(card.cardDate)),
new SqlParameter("@Time",Convert.ToDateTime(card.cardDate)),
new SqlParameter("@status",card.stuStatus),
new SqlParameter("@explain",card.stuExplain),
new SqlParameter ("@userNo",card.cardenroll )
};
string sql = "Pro_AddInfo";
int rows = SQLHelper.ExecuteNonQuery(sql, pars,CommandType.StoredProcedure); //executeNonquery执行查询(用于不返回行的查询以查看该查询返回的行)
if (rows>0)
{
flag =true;
}
return flag;
在D层中写入的参数是三个表中所有的参数,存储过程的应用,使我们不必在D层写三个Insert 语句,只需要sql=“存储过程名称”就直接在数据库总进行了Insert语句的执行,在这里值得注意的是,之前我们写的是CommandType.Text,现在要写CommandType.StoredProcedure。