【新闻发布系统】——存储过程

来源:互联网 发布:mysql自动增长赋值 编辑:程序博客网 时间:2024/06/10 08:27

    我们开发软件、进行编程,经常会和数据库打交道。最近在学习牛腩新闻发布系统的时候,其中提到了存储过程。在没接触存储过程之前,我还天真的认为:数据库的增删改查都是在代码中实现的。只要懂得增删改查的语句,基本上操作数据库就没有什么问题了。但是,这远未达到一个合格的程序员的标准。


一、定义


    官方:存储过程(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参数的数据类型ASBEGIN    --下边这三句现在还用不到,直接删掉-- 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)ASBEGIN--事务--更新学生表中的字段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 FunctionEnd Class


剩下的U、B、接口、工厂都与原来相同。


四、总结


     任何东西给我们带来便利的同时,其身后必然隐藏着它的另一面。的确,使用存储过程会让我们的工作方便很多,但同时,我们也必须要认识到到过多的使用存储过程给我们带来的危害。

0 0