由于对于存储过程的不够熟悉,我的上机敲了两天,才调试完成。下面就简单说一下我的思路吧,用了不少的嵌套循环,不太合适。
1、查卡号是否存在且是否注销
2、查卡号是否已经上机
3、查该卡的余额是否小于额定的最小金额
4、插入上机表
存储过程:
<span style="font-family:KaiTi_GB2312;font-size:24px;">ALTER PROCEDURE [dbo].[pro_Online] @CardNo char(10), @ondate date, @ontime time(0), @status char(8), @computer char(50), @opt int AS declare @studentNo char(11), @studentName char(10), @department char(10), @sex char(6), @cash nvarchar(10) BEGIN SET NOCOUNT ON; if @opt=1 --查询该卡是否注册,是否可以使用 begin exec('select * from T_Card_Info where CardNo='+@CardNo+'') end --查询该卡是否正在上机。 if @opt=2 begin exec('select * from T_OnOffline_Info where CardNo ='+@CardNo+' and offdate is null') end if @opt=3 --查询该卡余额是 否符合最少余额标准 begin exec('select studentNo,department, type,studentName,sex,cash from V_CS where CardNo ='+@CardNo+' and cash >limitcash') end if @opt=4 begin insert into T_OnOffLine_Info(CardNo,ondate,ontime,status,computer)values(@CardNo,@ondate,@ontime,@status,@computer) end end</span>
对应B层的判断:
<span style="font-family:KaiTi_GB2312;font-size:24px;"> Dim OnlineFactory As New Factory.LoginFactory Dim IUser As IDAL.LoginIDAL '调用创建用户的工厂方法 IUser = OnlineFactory.CreateIUserInfo() '调用工厂的create IUser方法创建Iuser接口实例 Dim mylist As New List(Of Entity.OnlineEntity) Dim opt As Integer For opt = 1 To 3 Onlineentity.opt = opt Select Case opt Case 1 mylist = IUser.Online(Onlineentity) If mylist.Count = 0 Then '存在该卡 MsgBox("该卡不存在,请先注册再使用") ElseIf mylist(0).status = "未使用" Then MsgBox("该卡已注销,请先激活!") Return Nothing Exit Function End If Case 2 mylist = IUser.Online(Onlineentity) If mylist.Count = 0 Then Else MsgBox("该卡正在上机,请勿重复上机!") Return Nothing Exit Function End If Case 3 mylist = IUser.Online(Onlineentity) If mylist.Count = 0 Then MsgBox("余额不足,少于最小金额" & Entity.OnlineEntity.limitcash & "元,请充值后上机", , "温馨提示") Return Nothing Exit Function End If Case 4 mylist = IUser.Online(Onlineentity) If mylist.Count <> 0 Then MsgBox("上机成功") End If End Select Next Return mylist</span>存储过程和B层是紧密相连的。
存储过程的opt=1,先查询该卡是否注册,所以执行查询语句,如果执行出来的查询语句为空即:B层显示的count=0,则证明数据库没有该卡,则给用户一个提示:该卡不存在。类似的opt=2也是一样的。
不一样的是opt=3.在opt=3中,我们依旧是执行查询语句,但是加上了对于金额的判断,在这个判断中,用上了视图,因为我们要查一些学生的基本信息,即student表。我们还需要比较金额。卡中的金额设计到card表。最小金额设计到datebasic表。所以视图就是由三个表来组成的。条件就是该卡号以及金额是否符合。如果符合我们就走第四步:插入数据到line表中。至于看是否符合,是由B层的case3决定的。如果它的金额小于最小金额,那么直接退出这个循环,也就不再走case4这条线了。
总体分析:每次判断都是在重新走一条线。循环太多,不利于后期的维护。