一,定义
官方定义:是在大型数据库系统中,一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
个人理解:对数据库进行复杂操作时,比如对多个表进行Update,Insert,Query,Delete时,对这些复杂操作的SQL语句的封装。
二,基本语法:
1.创建存储过程
基本语法:create procedurepro_name()
begin
.........
End
注意:过程名:尽量以pro_或者proc_开头,不建议使用使用sp_为前缀,因为SQLServer系统的存储过程都是以sp_开头,这样在查找的时候会先查找系统自身的,降低查询速度。
2.调用存储过程
基本语法:callpro_name()
注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递
3.删除存储过程
基本语法:
drop procedurepro_name//
注意:不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程
好了,基本存储过程的知识了解了,那我们现在机房收费系统阶段最主要用到了存储过程的创建以及使用,现在用一个例子简单介绍一下。
三,举例--机房收费系统退卡
1.首先创建存储过程:在自己所建的数据库中找到可编程性--右击存储过程---新建存储过程,如图:
2.在新建的存储过程中添加相应的代码:
-- =============================================
-- Author: 宋笑
-- Create date: 2014年6月29日
-- Description: 退卡,删除对应卡号的Card_info,student_info记录,同时添加RetundCard_info
-- =============================================
CREATE PROCEDURE [dbo].[Proc_RetundCard]
-- 添加所用到的参数
@Cardno varchar(20), --退卡的卡号
@Stuno varchar(20), --退卡人的学生号
@Userno varchar(20), --退卡人的教工号
@OnworkName varchar(20), --退卡的操作人员
@RetundDate varchar(20), --退卡日期
@RetundTime varchar(20), --退卡时间
@RetundCash varchar(20), --退款金额
@RetundName varchar(20) --退卡人
AS
BEGIN
SET NOCOUNT ON;
-- 添加涉及到的SQL语句
delete Card_info where Cardno =@Cardno --删除对应卡号的卡表记录
delete Student_info where Stuno =@Stuno --删除对应卡号的对应学生的学生记录
insert into CancelCard_info (Cardno ,Userno ,OnworkName ,RetundDate ,RetundTime ,RetundCash ,RetundName )values (@Cardno ,@Userno ,@OnworkName ,@RetundDate ,@RetundTime ,@RetundCash ,@RetundName ) --添加退卡记录
END
GO
3.应用存储过程(D层)
*************************************************
'文 件 名:SqlserverCancelCardDAL
'命名空间:DAL
'内 容:
'功 能:
'文件关系:
'作 者:宋笑
'小 组:XX
'生成日期:2014/6/29 21:12:19
'版 本 号:V1.0.0.0
'修改日志:
'版权说明:
'*************************************************
Imports Entity
Imports IDAL
Imports SqlHelper
Imports System.Data.SqlClient
Public Class SqlserverCancelCardDAL : Implements ICancelCard
'定义并实例化SqlHelper类
Private clsSqlHelper As SqlHelper.SqlHelper = New SqlHelper.SqlHelper
Public Function ReturnCard(enCard As CardEntity, enStudent As StudentEntity, enCancelCard As CancelCardEntity) As Integer Implements ICancelCard.ReturnCard
'定义并实例化参数数组,防止SQL注入
Dim paras As SqlParameter() = {New SqlParameter("@Cardno", enCancelCard.Cardno),
New SqlParameter("@Stuno", enStudent.Studentno),
New SqlParameter("@Userno", enCancelCard.Userno),
New SqlParameter("@OnworkName", enCancelCard.OnworkName),
New SqlParameter("@RetunrdDate", enCancelCard.RetundDate),
New SqlParameter("@ReturnTime", enCancelCard.RetundTime),
New SqlParameter("@ReturnCash", enCancelCard.RetundCash),
New SqlParameter("ReturnName", enCancelCard.RetundName)}
'定义并实例化字符串变量,用来要存放的SQL语句
Dim strsql As String = "PROC_CancelCard" '这里的strsql不再存放单条SQL语句而是存储过程
'这里的CommandType.Text换成了CommandType.StoredProcedure,执行的不是语句而是存储过程了。
Return clsSqlHelper.ExecAddDelUpdate(strsql, CommandType.StoredProcedure, paras)
End Function
End Class
注意:
IDAL层与D层相对应,函数的参数与应用的实体有关,应用了几个实体,参数增加,我这主要用到了卡,学生,退卡信息实体,所以参数为3个。
使用了存储过程,使代码变得更简单了,不用再编写多个函数来完成一个功能,有效地利用了封装。