终于做到退卡了,又开始出问题了。还是老规矩,首先我们来分析一下需求。我查阅了很多的资料,大家关于这个退卡的需求大概都是,首先在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语句且要全部执行要么都不执行,是不是很熟悉,这种需求用存储过程+事务比较好有没有。
纠结了半天才决定这个窗体怎么做,不过还是很有收获的。