周六周日写了些查询的窗体,感觉没什么新鲜的东西,都是一堆select,后来写的到了注册,上下机等,在一个方法里面,包含了多个增删改查的过程,可能上一个访问数据库的过程返回的结果又是下一个访问数据库读取数据的参数。也就是说,这些对数据库的增删改查是一个连贯的动作,比如,注册一个学生的时候,涉及到注册金额,这个注册金额同时也要写到充值表里面去。既然他们是一起的,后来就很自然想到了用存储过程,将多条SQL语句封装起来,这样不仅避免了代码中多次访问数据库的情况,而且也减少了代码量。
下面以充值做个DEMO,看一下这个存储过程:
USE [SecondCharge]
GO
/****** Object: StoredProcedure [dbo].[Recharge] Script Date: 06/09/2014 11:04:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[Recharge] --充值
@StuCardNum nchar(10), --卡号
@RecTeaName nchar(10), --充值教师
@RecRMB money --充值金额
as
declare @FirstRMB money --定义一个上次卡内余额的变量
declare @RecDate nchar(10) --定义充值日期
declare @RecTime nchar(10) --定义充值时间
Select @RecDate= CONVERT(varchar(100), GETDATE(), 23)
Select @RecTime=CONVERT(varchar(100), GETDATE(), 24)
--1,先取出此卡号对应的现在的总金额
--2,先向充值表里面写入一条充值记录
--3,然后更新学生信息表里面的金额
--4,最后返回充值信息表
select @FirstRMB=StuRMB from T_StuInfo where StuCardNum =@StuCardNum --查询卡内余额
insert into T_RechargeInfo values(@StuCardNum,
@RecTeaName,
@RecDate,
@RecTime,
@RecRMB,
'未结账'
)
update T_StuInfo set StuRMB=(@FirstRMB +@RecRMB) where StuCardNum =@StuCardNum
--返回信息:充值卡号,上次卡内余额,现在卡内余额,充值日期,充值时间,充值教师
select @StuCardNum as StuCardNum,
@FirstRMB as FirstRMB,
StuRMB as LastRMB,
@RecDate as RecDate,
@RecTime as RecTime,
RecTeaName
from T_RechargeInfo,T_StuInfo
where T_RechargeInfo.StuCardNum =T_StuInfo .StuCardNum
and T_StuInfo.StuCardNum =@StuCardNum
and RecDate=@RecDate
and RecTime=@RecTime
其执行结果如下:
解释一下:这个过程大致是这个样子的:
--1,先取出此卡号对应的现在的总金额
--2,先向充值表里面写入一条充值记录
--3,然后更新学生信息表里面的金额
--4,最后返回充值信息表
首先定义好传入的参数:卡号,充值教师,充值金额;然后,按照大致的过程,为每一条过程写一个SQL语句;最后是输出部分,如果输出结果是单个参数,可以用output,也可以如上所示,输出个表。
在输出的时候,可以用as更改输出表的列名。为什么要更改列名呢?目前看到两个好处:
1,在绑定DataGridView的时候,不用手动加载HeaderText,这种是对于返回到U层是datatable的情况。
2,另一种好处就是,在将存储过程执行完之后,将datatable转换为实体集合的时候,因为有一个属性名和 datatable的字段名必须对应的要求,所以,可以说,必须要求select语句中使用as命名字段名,否则实体集合会出现转换失败返回空集合的情况。