存储过程--机房收费系统

1、什么是存储过程? 

 定义:

 存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库server中,应用程序使用时仅仅要调用就可以。

 在敲机房收费系统的注冊窗口时,注冊窗口例如以下:

 

点击存盘之后,须要进行的操作,将学生信息写入到T_Student表中,将卡的信息写入到T_Card表中,将充值信息写入到T_Recharge表中,假设是不适用存储过程的话,须要单独向表中写入三次数据,每次都有非常多反复的对数据库进行操作的代码。而用了存储过程之后,仅仅须要把对应的參数和语句写入到数据库的存储过程中去,在client直接调用就可以。


2、如何使用存储过程?

 以上面的注冊为例,首先新建存储过程

 

数据库会自己主动弹出一个已经建好主要语句结构的存储过程,你仅仅须要在里面加入參数和语句就可以,存储过程代码例如以下:

USE [ChargeSystem]
GO
/****** Object:  StoredProcedure [dbo].[PROC_Register]    Script Date: 07/30/2014 21:30:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[PROC_Register]
	-- Add the parameters for the stored procedure here
	@stuID varchar(20),@stuName varchar(20),@stuSex varchar(4),@stuDepart varchar(20),@stuGrade varchar(20),@stuClass varchar(20),@stuNote varchar(50),
	@cardID varchar(10),@cardType varchar(20),@remainCash varchar(4),@registerAdmin varchar(10),@isChecked varchar(20),
	@userID varchar(11),@rechargeCash varchar(4)
AS
BEGIN
	-- 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(stuID ,stuName ,stuSex ,stuDepart ,stuGrade ,stuClass ,stuNote ) values(@stuID ,@stuName ,@stuSex,@stuDepart,@stuGrade ,@stuClass ,@stuNote )
    insert into T_Card (cardID,stuID ,cardType ,remainCash ,registerDate ,registerTime ,registerAdmin ,isChecked ) values(@cardID ,@stuID ,@cardType ,@remainCash ,CONVERT (varchar(20),GETDATE(),120) ,CONVERT (varchar(20),getdate(),108) ,@registerAdmin ,@isChecked )
    insert into T_Recharge (cardID ,userID ,rechargeCash ,rechargeDate ,rechargeTime ) values (@cardID ,@userID ,@rechargeCash ,CONVERT (varchar(20),GETDATE(),120) ,CONVERT (varchar(20),getdate(),108)  )
	
END

写完之后,要运行成功之后才干够调用

DAL层调用代码

Public Function Register(ByVal enStudent As Entity.StudentEntity, ByVal enCard As Entity.CardEntity, ByVal userID As String, ByVal enRecharge As Entity.RechargeEntity) As Boolean Implements IRegister.Register
        Dim sqlHelper As New Sqlhelper   '实例化sqlHelper类
        Dim cmdType As CommandType = CommandType.StoredProcedure    '定义命令类型
        Dim cmdText As String = "PROC_Register"   '数据库运行字符串
        '传參
        Dim parameter As SqlParameter()
        parameter = {New SqlParameter("@userID", userID),
                     New SqlParameter("@stuName", enStudent.StuName),
                     New SqlParameter("@stuID", enStudent.StuID),
                     New SqlParameter("@cardID", enCard.CardID),
                     New SqlParameter("@stuSex", enStudent.StuSex),
                     New SqlParameter("@stuDepart", enStudent.StuDepart),
                     New SqlParameter("@stuGrade", enStudent.StuGrade),
                     New SqlParameter("@stuClass", enStudent.StuClass),
                     New SqlParameter("@stuNote", enStudent.StuNote),
                     New SqlParameter("@cardType", enCard.CardType),
                     New SqlParameter("@remainCash", enCard.RemainCash),
                     New SqlParameter("@rechargeCash", enRecharge.RechargeCash)}
        Return sqlHelper.ExcuteAddDelUpdate(cmdText, cmdType, parameter)   '返回运行的结果,成功True;否则,False
    End Function


3、为什么要使用存储过程?

  1、SQL语句运行时要先编译,然后再运行,存储过程就是编译好的一些SQL语句,应用程序须要时直接调用即可,所以存储过程比直接使用SQL语句的效率要高。

  2、当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。

 3、就比方说注冊的时候,假设过程中出现了bug,那么你的调试工作的量会非常大,而假设用存储过程的话,若是SQL语句的问题,那你就能够在一个地方对SQL语句进行调试。



原文地址:https://www.cnblogs.com/mfrbuaa/p/4280318.html