【前言】
以前学习的时候接触过存储过程,当时没有认真的研究它,只知道有这么个东西,现在就听我来唠叨一下存储过程
【正文】
Why?
当涉及到多条SQL语句的时候,就可以使用存储过程,但也要适当的使用
优点:
1.提高运行速度
2.增强了SQL的功能、灵活性和代码的重用性
3.降低网络的通信量。存储过程位于服务器上,调用的时候只需要传递存储过程的名称以及参数就可以了,因此降低了网络传输的数据量。
4.间接实现安全控制功能
缺点:
若一个程序系统中大量使用存储过程,如果在后期需求变化时导致数据结构
发生变化,就会发生问题,而且后期系统维护也会非常困难,代价也是非常大的。
What?
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。只是用来完成数据查询、数据处理操作,不可用来创建数据库对象的语句
How?
1.建立存储过程
2.编写存储过程
USE [JF]
GO
/****** Object: StoredProcedure [dbo].[PROC_Register] Script Date: 2017-05-31 15:24:28 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <牛千千>
-- Create date: <2017-05-29>
-- Description: <注册 上机卡,同时处理 Card、Recharge、Student表>
-- =============================================
ALTER PROCEDURE [dbo].[PROC_Register]
-- 为存储过程添加参数
@CardNo char(10),
@CardStudentNo char(10),
@CardCash char(10),
@CardType char(10),
@CardDate date,
@CardTime Time(0),
@CardIsCancel char(10),
@CardIscheck char(10),
@CardUserID char(10)
AS
BEGIN
-- 添加SQL语句
insert into Card_Info (cardNo,cash ,type ,date ,time ,isCancel,isCheck,userID ,studentNo )values(@CardNo,@CardCash,@CardType,@CardDate,@CardTime,@CardIsCancel,@CardIscheck,@CardUserID,@CardStudentNo)
update Student_Info set cardNo=@CardNo WHERE studentNo=@CardStudentNo
insert into ReCharge_Info(cardNo,userID,rechargeCash,date,time)values(@CardNo,@CardUserID,@CardCash,@CardDate,@CardTime)
END
存储过程写好了,要在数据库中执行一下,以后就可以用了。
3.在VS中调用存储过程:
Public Function AddCard(card As Entity.RegisterCardInfo) As Integer Implements IDAL.RegisterICard.AddCard
Dim sqlHelper As New SqlHelper.SqlHelper
Dim sqlHelper1 As New SqlHelper.SqlHelper
Dim sqlHelper2 As New SqlHelper.SqlHelper
Dim int As New Integer
Dim sql As String
Dim sqlParams As SqlParameter() = {New SqlParameter("@CardNo", card.CardNo),
New SqlParameter("@CardStudentNo", card.StudentNo),
New SqlParameter("@CardCash", card.Cash),
New SqlParameter("@CardType", card.Type),
New SqlParameter("@CardDate", card.CardDate),
New SqlParameter("@CardTime", card.CardTime),
New SqlParameter("@CardIsCancel", card.IsCancel),
New SqlParameter("@CardIsCheck", card.IsCheck),
New SqlParameter("@CardUserID", card.UserID)}
'sql = "Insert into Card_Info (cardNo,cash ,type ,date ,time ,isCancel,isCheck,userID ,studentNo )values(@CardNo,@CardCash,@CardType,@CardDate,@CardTime,@CardIsCancel,@CardIscheck,@CardUserID,@CardStudentNo)"
sql = "PROC_Register" '应用存储过程
int = sqlHelper.ExecAddDelUpdate(sql, CommandType.StoredProcedure, sqlParams)
Return int
End Function
如果不用存储过程的话,这里的代码就会很多
注意:
在不使用存储过程的时候,红框里面为CommandType.Text
如果你的存储过程中的SQL语句是第一条查询,第二条要使用查询结果的话,就不用定义参数直接定义变量进行赋值查询
【总结】
推荐一篇博客:存储过程详解