问题背景:
原先做机房收费系统的时候,对于D层访问数据库,对数据库的操作基本上都是通过SQL语句实现的,这样导致的一个问题就是在完成机房收费系统中,产生了一些容易被忽略的逻辑黑洞。例如:在退卡业务逻辑中,要判断从注册表中是否删除成功,其次,还要判断是否将退卡记录添加到退卡记录表中,两者都成功之后,标识退卡业务逻辑完成,任何一个失败,退卡业务逻辑标识失败。我原先的思路有点片面化,就是通过and连接符来判断两者是否都为true:
If ICancelcard.AddCancelCard(EntityCancelCard) = True And IStuInfo.DeleteStudent(EntityCancelCard) = True Then |
但是这样就出现了一个思维漏洞:假设一种情况——从卡的注册表中删除成功了,但是添加信息的时候却添加失败了,按照上述代码,则会给用户提示:用户退卡失败。但是这时候却已经从卡的注册表中删除的情况;
解决方式(一):——存储过程
存储过程:
是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。对于上述的问题,用存储过程来解决:当从卡注册表中删除某个卡的时候,将卡的信息添加到退卡记录表中:
CREATEPROCEDURE Pro_CancelCard @StudentIDchar(10), @CardIDint, @CancelCashnumeric(18,2), @Datechar(20), @TimeChar(20), @UserIDChar(10), @StatusChar(10), AS BEGIN deletefrom TB_Student_Info whereCardID=@CardID SETNOCOUNT ON; insert TB_CancelCard_Infovalues(@StudentID,@CardID,@CancelCash,@Date,@Time,@UserID,@Status) END GO |