周六周日写了些查询的窗口,感觉没什么新奇的东西,都是一堆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命名字段名,否则实体集合会出现转换失败返回空集合的情况。