一、使用背景

机房收费结账的时候,需求是当选择一个用户,同时显示该用注册、充值和退卡记录,这些数据来提供结账数据,而结账之后要同时更新卡、充值、退卡表三个表,如果直接写sql语句的话会是很复杂的。而这些需求可以封装为一个存储过程,点击结账之后只需要传入参数执行存储过程即可。

二、存储过程简介

存储过程(stored procedure)是一组为了完成特定功能的sql语句集,经编译后存储在中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。

三、存储过程的优点:

1、封装事务规则。

2、允许标准式

3、能够实现较快的执行速度(批处理的t——sql语句每次运行时都要进行编译和优化,存储过程是预编译)

4、能过减少网络流量

5、被作为一种安全机制来充分利用(避免非授权用户对数据的访问)

四、在机房收费系统中的应用

首先在数据库中建立存储过程

语句:

-- =============================================
-- author:		
-- create date: 
-- description:	
-- =============================================
create procedure  [dbo].[proc_payaccounts]   
	-- add the parameters for the stored procedure here
	@struserid char(6)   --用户id	
as
begin
	update card_info set billstatus ='已结账' where userid =@struserid and billstatus ='未结账'
	update recharge_info set status ='已结账' where userid =@struserid and status ='未结账'
	update cancelcard_info set billstatus ='已结账' where userid =@struserid and billstatus ='未结账'
end

d层代码:

 public function settleaccounts(byval euser as entity.userinfo) as integer implements idal.iuser.settleaccounts

        dim helper as new helper.sqlhelper
        dim strsql as string = "proc_payaccounts"   '声明并实例化存储过程
        dim sqlparams as sqlparameter() = {new sqlparameter("@struserid", euser.userid)} '声明并实例化参数数组
        return helper.execadddelupdate(strsql, commandtype.storedprocedure, sqlparams)  '执行并返回更新操作结果
    end function

五、总结:

1.存储过程目的在于能够方便的从系统表中查询信息或完成于更新数据库表相关的管理任务。能够实现较快的执行速度如果某一操作包含大量t-sql语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化并给出最终被存在系统表中的存储计划。而批处理的t-sql语句每次运行都需要预编译和优化,所以速度要慢一些。

2.使用存储过程,就是对数据库进行优化,从而达到提高系统运行速度。存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般sql语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。

3.当对数据库进行复杂操作时(如对多个表进行 update,insert,query,delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 sql 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。
4.存储过程可以重复使用,可减少数据库开发人员的工作量。
5.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。