【VB.Net机房重构】存储过程的使用

        重构机房的时候,听到了很多新的名词,其实也不是,在学习SQL的时候都接触过,但那个时候紧紧是停留在了理论上,现在通过机房进行实践。触发器,视图,存储过程等等

        存储过程:将一系列相关联的SQL语句集合到一起。在程序的代码中直接执行存储过程的名字,不用每次都写这么多语句;

        重构的充值表,需要同时对三张表添加数据,如果用代码编写的话,实现是没有问题的,但是如果同时操作的表更多了,怎么办。怎么提高代码的效率,提高系统的性能?这个时候用上存储过程,就初步解决了这个问题,提高了代码重用性。


优点:

1.安全性。        --保护表名和字段名。
2.提高SQL Server执行速度    --一次编译,多次执行。
3.提高重用性        --相同的功能需求
4.减少服务器负担。    --降低服务器的使用率,提高访问速度。
5.将复杂操作,用存储过程封装起来与数据库提供的事务处理结合一起使用。

分类:

1.自定义的
2.扩展的:编程语句创建的外部过程,加载动态链接库。
3.系统的。用来进行系统的各项设定.取得信息.相关管理工作。例如:sp_help,sp_rename等等。
是否有参数

1.带参数

2.不带参数


对存储过程的各种操作:

1.创建(可以用代码或者企业管理器)

自定义存储过程与系统存储过程进行区分,不要使用sp_开头。

CREATE PROCEDURE pro_name    --存储过程名字;
    [ @parameter data_type]    [ output ]    --参数和参数类型   --参数是输出参数
    [ with encryption ]    --加密,将创建存储过程本身的语句加密。保护存储过程用到的表信息。提高数据库的安全性。
    AS
    Begin

        <sql_statement>

    End


2.执行
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

        存储过程的使用,不单单减少了代码,而且提高了系统的性能和效率,机房重构,更多的还是在于接触很多以前没有接触的东西,在实践中发现它们的优点,善于使用,善于发现更加的解决方案。



你可能感兴趣的:(sql,存储过程,VB.NET)