重构机房的时候,听到了很多新的名词,其实也不是,在学习sql的时候都接触过,但那个时候紧紧是停留在了理论上,现在通过机房进行实践。触发器,视图,存储过程等等
存储过程:将一系列相关联的sql语句集合到一起。在程序的代码中直接执行存储过程的名字,不用每次都写这么多语句;
重构的充值表,需要同时对三张表添加数据,如果用代码编写的话,实现是没有问题的,但是如果同时操作的表更多了,怎么办。怎么提高代码的效率,提高系统的性能?这个时候用上存储过程,就初步解决了这个问题,提高了代码重用性。
优点:
1.安全性。 --保护表名和字段名。2.提高sql Server执行速度 --一次编译,多次执行。
3.提高重用性 --相同的功能需求
4.减少服务器负担。 --降低服务器的使用率,提高访问速度。
5.将复杂操作,用存储过程封装起来与数据库提供的事务处理结合一起使用。
分类:
1.自定义的2.扩展的:编程语句创建的外部过程,加载动态链接库。
3.系统的。用来进行系统的各项设定.取得信息.相关管理工作。例如:sp_help,sp_rename等等。
是否有参数
1.带参数
2.不带参数
对存储过程的各种操作:
1.创建(可以用代码或者企业管理器)
自定义存储过程与系统存储过程进行区分,不要使用sp_开头。
[ @parameter data_type] [ output ] --参数和参数类型 --参数是输出参数
[ with encryption ] --加密,将创建存储过程本身的语句加密。保护存储过程用到的表信息。提高数据库的安全性。
AS
Begin
<sql_statement>
End
EXEC 或者 EXECUTE pro_name
3.修改
将CREATE修改为ALTER --ALTER不能修改存储过程的名字。
4.修改存储过程(,表,视图等)的名字。使用系统存储过程
SP_RENAME 'pro_old','pro_new'
5.查看存储过程
用系统的存储过程 sp_helptext pro_name;如果存储过程加密的话,就不能看到了,加密提高了数据的安全性。
6.删除存储过程
删除前,要确保没有对象在使用存储过程。
DROP PROC pro_name.
实践:
机房充值表的存储过程,带有参数
CREATE PROCEDURE pro_Register -- Add the parameters for the stored procedure here @cardNo char(11),@cash numeric(10,3),@IsCheck char(10),@status char(10),--定义所有的变量,类型要和数据库表中的类型一致; @cardDate char(10),@cardTime char(10),@addMoney numeric(19,4),@rechargeDate date,@rechargeTime time,@userID char(10),@studentNo char(11),@studentName char(10),@sex char(6),@department char(10),@grade char(10),@studentClass char(10),@note varchar(50) AS BEGIN --Begin ...End 块语句 -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for procedure here --向表中插入内容; insert into T_Student_Info (cardNo,studentNO,studentName,sex,department,grade,studentClass,note ) values (@cardNo,@studentNo,@studentName,@sex,@department,@grade,@studentClass,@note ) insert into T_card_Info (cardNo,cash,IsCheck,status,cardDate,cardTime,userID )values (@cardNo,@cash,@IsCheck,@status,@cardDate,@cardTime,@userID ) insert into T_ReCharge_Info (cardNo,addMoney,rechargeDate,rechargeTime,userID,status ) values(@cardNo,@addMoney,@rechargeDate,@rechargeTime,@userID,@status ) END GO
在D层代码:
Public Function insertStudent(student As StudentEntity,card As CardEntity,recharge As RechargeEntity) As Integer Implements IDAL.IStudent.insertStudent Dim helper As New sqlHelper.sqlHelper '实例化sqlHelper类 Dim params As sqlParameter() = {New sqlParameter("@StudentNo",student.StudentNo),'存储过程中出现的参数 New sqlParameter("@cardNo",card.CardNo),New sqlParameter("@studentName",student.StudentName),New sqlParameter("@sex",student.Sex),New sqlParameter("@department",student.Department),New sqlParameter("@grade",student.Grade),New sqlParameter("@StudentClass",student.StudentClass),New sqlParameter("@note",student.Note),New sqlParameter("@cash",card.Cash),New sqlParameter("@Ischeck",card.IsCheck),New sqlParameter("@status",card.Status),New sqlParameter("@cardDate",card.CardDate),New sqlParameter("@cardTime",card.CardTime),New sqlParameter("@addMoney",recharge.AddMoney),New sqlParameter("@rechargedate",recharge.RechargeDate),New sqlParameter("@rechargeTime",recharge.RechargeTime),New sqlParameter("@userID",Entity.UserEntity.UserHead) } Dim result As Integer '定义一个整形变量,存放返回值; '执行helper对象的ExecuteNonQuery带参数的方法,参数是存储过程名,存储过程类型,还有参数; result = helper.ExecuteNonQuery("pro_register",CommandType.StoredProcedure,params) Return result End Function
存储过程的使用,不单单减少了代码,而且提高了系统的性能和效率,机房重构,更多的还是在于接触很多以前没有接触的东西,在实践中发现它们的优点,善于使用,善于发现更加的解决方案。
原文链接:https://www.f2er.com/vb/257467.html