存储过程-------------代码优化、逻辑优化

       在前两天做注册时,需要考虑学生表、卡信息表、充值信息表等多个表,类似与这种情况需要操作多个表的操作(充值、退卡、上机、下机、结账等等),如果还是用原来的办法多个函数重复的调用,太浪费精力了,代码麻烦,调用关系搞不好还乱了,第一次做机房的时候,听说过这个词感觉特别难,存储过程很是神奇,现在来看,也就那么回事(走过了,发现啥事不能事先被自己所吓倒),先来理解存储过程的相关知识

下面是自己重构机房收费系统的存储过程的使用

提高班存储过程命名规范:

存储过程名 = 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层没有给变量赋值(检查从上一层获取的值是否正确)

第二是:参数名称不正确.(修改名称务必一致)


存储过程总结:


    它是一组预先编译好的Transact-SQL语句。将其放在服务器上,由用户通过指定存储过程的名字来执行它。存储过程可以作为一个独立的数据库对象,也可以作为一个单元被用户的应用程序调用。存储过程可以接收和输出参数,返回执行存储过程的状态值,还可以嵌套调用。


    特点:

      1、存储过程可以接受参数,并以接收参数的形式返回多个参数给调用存储过程和批处理

      2、包含执行数据库操作的编程语句,也可以调用其他存储过程。

      3、向调用过程或批处理返回状态值,以反映存储过程的执行情况。


    注意:

      存储过程和函数不同,存储过程是用户定义的一系列SQL语句的集合,设计特定的表或其他对象的任务,用户可以调用存储过程。它可以以变量的形式返回参数。

      而函数通常是数据库已经定义的方法,它接受参数并返回某种特定的值,并且不涉及特定用户表。 

它的功能:

    1、条件执行  if。。then。。else

    2、循环控制语句while 和 for

    3、命名变量

    4、命名过程

    5、像执行单条SQL语句一样执行一系列SQL语句。


优点:

    封装——可用于操作数据库对象的方法,用户只需要知道它的输入输出参数并理解其目的即可。

    改善性能——已经预先编译,提高效率.

    减少网络流量——只返回最后的结果集

    重要性——针对复杂逻辑,应用已经测试好的存储过程,不容易发生错误。

    安全性——如果数据库拥有者DBO 或者 系统管理员 SA 编译并保存了存储结构,存储过程就有了对它使用的数据库对象的所有访问权限。因此系统管理员可以向单独的用户授予对数据库对象的最小访问权限,而不是直接允许用户使用数据库对象。




评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值