重构——退卡——触发器试验

    终于做到退卡了,又开始出问题了。还是老规矩,首先我们来分析一下需求。我查阅了很多的资料,大家关于这个退卡的需求大概都是,首先在T_Card中找到要退卡记录,删除card表中的记录,并将这条记录添加到退卡表中。如果是这个需求的话,最好的办法就是用触发器,什么是触发器呢?


    定义:与表相关的特殊的存储过程。

    特点:不能直接执行,只能被表上的Insert、Update、Delete事件触发

                不能传递或接受参数


    首先我按这个需求写了一个触发器,下面就是我在Card表下添加的一个触发器:

    

<span style="font-size:18px;"><strong>USE [chonggou]
GO
/****** Object:  Trigger [dbo].[myTrigger]    Script Date: 01/31/2016 23:24:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER TRIGGER [dbo].[myTrigger] on [dbo].[T_Card] for delete  --触发器的名字mytrigger,delete触发
AS 
	--声明变量
	declare @StudentID nchar(10)
	declare @CardID nchar(10)
	declare @Cancelcash nchar(10)
	declare @Canceldate nchar(10)
	declare @Canceltime nchar(10)
	declare @UserID nchar(10)
	declare @Ischeck nchar(10)
	--给变量赋值
	select @CardID = CardID from deleted 
	select @StudentID = StudentID from deleted 
	select @Cancelcash = Cash from deleted 
	select @UserID = UserID from deleted 
	select @Ischeck = Ischeck from deleted 
	set @Canceldate = CONVERT (nchar(10),GETDATE (),111)  --获取当前日期
	set @Canceltime = CONVERT (nchar(10),GETDATE (),108)  --获取当前时间
	
	if @@ROWCOUNT > 0 --受影响的行数
BEGIN
   Insert into dbo.T_Cancelcard (StudentID ,CardID ,Cancelcash ,Canceldate ,Canceltime ,UserID  ,Ischeck )
   values (@StudentID ,@CardID ,@Cancelcash ,@Canceldate ,@Canceltime ,@UserID ,@Ischeck )
END
</strong></span>

    D层中的sql = "delete from T_Card where CardID = @CardID"  用Delete来触发触发器。

    

    接下来问题来了,如图

    

    检查了一下,找到了问题,退卡的时候界面上需要显示一些退卡信息,我没有用泛型,所以要返回Datatable,我每一层的返回值都是Datatable,可是执行完sql后返回值是int型的,所以报错,执行delete是不会返回Datatable的,显然,这与我们一开始分析的需求是矛盾的。


    于是,我又开始重新分析需求,因为U层要返回退卡信息,所以我们要先要对要退卡的卡号进行查询,查到要退卡的记录后,更新这条记录的字段,把状态改为off,最后把这条记录插入到Cancelcard表中,总结一下也就是,先Select再Update最后Insert,也就是说要同时执行多条SQL语句且要全部执行要么都不执行,是不是很熟悉,这种需求用存储过程+事务比较好有没有。


    纠结了半天才决定这个窗体怎么做,不过还是很有收获的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值