存储过程-------------代码优化、逻辑优化
在前两天做注册时,需要考虑学生表、卡信息表、充值信息表等多个表,类似与这种情况需要操作多个表的操作(充值、退卡、上机、下机、结账等等),如果还是用原来的办法多个函数重复的调用,太浪费精力了,代码麻烦,调用关系搞不好还乱了,第一次做机房的时候,听说过这个词感觉特别难,存储过程很是神奇,现在来看,也就那么回事(走过了,发现啥事不能事先被自己所吓倒),先来理解存储过程的相关知识
下面是自己重构机房收费系统的存储过程的使用
提高班存储过程命名规范:
存储过程名 = PROC + “_” + 存储过程含义。
自己写的关于注册学生卡时的存储过程:
ALTER PROCEDURE [dbo].[PROC_StudentRegister]
@studentId varchar(20),@studentName varchar(20),@sex varchar(20),@department varchar(20),@grade varchar(20),@stuClass varchar(20),@studentStyle varchar(20),
@cardId varchar(20),@rechargeCash varchar(20),@rechargeDate varchar(20),@rechargeTime varchar(20),@balance numeric(10,2),@strAdmin varchar(20),@isCheck varchar(20),
@status varchar(20),@regDate varchar(20),@regTime varchar(20)
AS
BEGIN
insert into T_Student_info(studentId ,studentName,sex,department,grade,stuClass,studentStyle,strAdmin) values (@studentId,@studentName,@sex,@department,@grade,@stuClass,@studentStyle,@strAdmin)
insert into T_Recharge_info(cardId,rechargeCash,rechargeDate,rechargeTime,strAdmin,isCheck) values(@cardId,@rechargeCash,@rechargeDate,@rechargeTime,@strAdmin,@isCheck )
insert into T_Card_info(cardId,studentId,balance,status,isCheck,strAdmin,regDate,regtime) values(@cardId,@studentId,@balance,@status,@isCheck,@strAdmin,@regDate,@regTime)
END
D层调用存储过程的代码
Public Class SqlStudentInfoDAL
Implements IStudent
''' <summary>
''' 添加学生信息
''' </summary>
''' <param name="enStudent">定义学生实体参数</param>
''' <param name="enCard">定义卡实体参数</param>
''' <param name="enRecharge"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function AddStudent(ByVal enStudent As Entity.StudentEntity, ByVal enCard As CardEntity, ByVal enRecharge As RechargeEntity) As Boolean Implements IStudent.AddStudent
Dim sql As String = "PROC_StudentRegister" '存储过程
Dim paras As SqlParameter() '参数集合
paras = New SqlParameter() {New SqlParameter("@studentId", enStudent.Stu_Id),
New SqlParameter("@studentName", enStudent.Stu_Name),
New SqlParameter("@sex", enStudent.Stu_Sex),
New SqlParameter("@department", enStudent.Stu_department),
New SqlParameter("@grade", enStudent.Stu_Grade),
New SqlParameter("@stuClass", enStudent.Stu_Class),
New SqlParameter("@studentStyle", enStudent.Stu_Style),
New SqlParameter("@strAdmin", enStudent.Stu_strAdmin),
New SqlParameter("@cardId", enCard.card_cardId),
New SqlParameter("@balance", enCard.card_balance),
New SqlParameter("@status", enCard.card_status),
New SqlParameter("@isCheck", enCard.card_isCheck),
New SqlParameter("@regDate", enCard.card_regDate),
New SqlParameter("@regTime", enCard.card_regTime),
New SqlParameter("@rechargeCash", enRecharge.rec_rechargeCash),
New SqlParameter("@rechargeDate", enRecharge.rec_rechargeDate),
New SqlParameter("@rechargeTime", enRecharge.rec_rechargeTime)
'调用一个代码参数的存储过程的查询过程 }
Return SqlHelper.DBHelper.ExecuteNoQuery(sql, CommandType.StoredProcedure, paras)
End Function
在写存储过程的时候,注意存储过中定义的变量类型与D层的名字要一致,否则出现如下图:
这样问题出现的原因:
第一是:D层没有给变量赋值(检查从上一层获取的值是否正确)
第二是:参数名称不正确.(修改名称务必一致)
存储过程总结:
特点:
它的功能:
优点: