我们开发软件、进行编程,经常会和数据库打交道。最近在学习牛腩新闻发布系统的时候,其中提到了存储过程。在没接触存储过程之前,我还天真的认为:数据库的增删改查都是在代码中实现的。只要懂得增删改查的语句,基本上操作数据库就没有什么问题了。但是,这远未达到一个合格的程序员的标准。
一、定义
官方:存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程
在现阶段,我们使用存储过程的情况看来,存储过程就是把一些SQL语句放到一起,进行执行,简化了D层的逻辑。
二、优缺点
1、优点
存储过程的能力大大增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算
可保证数据的安全性和完整性:通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
2、缺点:
重新编译问题:当引用的对象发生改变时,存储过程需要进行重新编译
如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的。维护起来更加麻烦!
三、使用
下边我以原来我们做过的机房收费系统中的充值操作为例:充值时,需要将充值记录写到充值表中,同时还要将学生表中的学生余额进行更新。
1、建立存储过程,在SQLServer中进行操作
添加完后,出现在你面前的是将是这个
-- =============================================
-- Author: <Author,,Name> 作者姓名
-- Create date: <Create Date,,> 创建时间
-- Description: <Description,,> 功能描述
-- =============================================
CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName>
--Procedure_Name存储过程的名称
-- Add the parameters for the stored procedure here
--添加存储过程的参数(下边你将要用的参数)
<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>,
<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0>
--@Param过程中的参数,Datatype参数的数据类型
AS
BEGIN
--下边这三句现在还用不到,直接删掉
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
--这里就要写你的SQL语句
SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
END
2、编写存储过程
-- =============================================
-- Author: 杨晨光
-- Create date: <Create Date,,>
-- Description: 充值操作
-- =============================================
ALTER PROCEDURE [dbo].[PRO_charge]
--加入参数,参数是你下边要用到的
@cardNo nchar(10),
@chargeMoney nchar(10),
@Teacher nchar(10),
@checkState nchar(10),
@Balance nchar(10)
AS
BEGIN --事务
--更新学生表中的字段
update T_StudentInfo set Balance =@chargeMoney +Balance
where cardNo=@cardNo
--向充值表中添加一条记录
insert into T_Recharge (cardNo,chargeMoney,Teacher,checkState)
values (@cardNo,@chargeMoney,@Teacher,@checkState)
END
注:过程名[PRO_charge]:尽量以pro_或者proc_开头,不建议使用使用sp_为前缀,因为SQLServer系统的存储过程都是以sp_开头,这样在查找的时候会先查找系统自身的,降低查询速度。
3、使用:在D层中进行调用
Public Class RechargeDAL
: Implements IRecharge
'定义一个将充值记录写入充值表的函数,,,调用存储过程
Public Function Save(user As Entity.RechargeEntity) As Boolean Implements IRecharge.Save
'定义一个数据库操作的助手类
Dim MySqlHelper As New SqlHelper
'定义数据库操作的语句
Dim strSql As String
strSql = "PRO_charge"
'加入参数
Dim paras As SqlParameter() = {New SqlParameter("@cardNo", user.cardNo),
New SqlParameter("@chargeMoney", user.chargeMoney),
New SqlParameter("@Teacher", user.Teacher),
New SqlParameter("@checkState", user.checkState)}
Return MySqlHelper.ExecAddDelUpdate(strSql, CommandType.StoredProcedure, paras)
End Function
End Class
四、总结