機房重構之退卡——觸發器增強版
阿新 • • 發佈:2019-01-08
I have to say that success always make people happy
之前自己在退卡窗體的時候,發現自己需要用到觸發器,然後就在網上蕩阿蕩的,找到了合適的程式碼照著敲了,遇到了一點問題,但是立馬解決了,在SQL裡面也執行成功了,我天真的以為在D層寫一句(下面的那句)delete語句就可以同時刪除cardbalance表裡面的卡和在cancelcard表中增加一條記錄,沒想到怎麼也不成功,觸發器似乎沒被觸發一樣,後來在網上找問題啊找問題,最終才發現,還是得看懂觸發器每段話的意思。
string sql = "delete from CardBalance where [email protected]";
如果不看懂觸發器的意思就寫,那麼就是容易出錯的,我上一篇的部落格基本是對的,但是造成我的觸發器沒有觸發成功的原因就是我的表寫錯了,下面我給我自己分析一下哈,後退!我要開始表演了
然後還有一點值得注意,就是下面這點:
That‘s all……of course not the end
接下來就說一下為什麼是增強版了
我終於弄成功之後發現,如果我只刪除了Card表中的卡的記錄和在銷卡記錄表中新增一條資訊,那麼就會出現資訊之間的錯誤,容易讀髒資料。因此必須在增加銷卡記錄資訊的時候再刪除Student表和上下機表中的相應記錄,因此在SQL中寫的觸發器還要增加一段話,下面是完整的程式碼
USE[Jifang]
Go
/******boject:Trigger [].[] Script Date : ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/******CREATE TRIGGER [dbo].[myTrigger]******/
ALTER TRIGGER canceltrigger --建立觸發器,觸發器的名字為
ON [dbo].[CardBalance]
AFTER DELETE
AS
BEGIN
--宣告變數
declare @CardNumber int,
@StuNumber varchar(MAX),
@StuName varchar(MAX),
@Balance money,
@CancelTime varchar(MAX),
@CancelDate varchar(MAX)
select @CardNumber=CardNumber FROM deleted
select @StuNumber =StuNumber FROM deleted
select @Balance =Balance FROM deleted
set @CancelDate = CONVERT (date ,GETDATE(),111) --獲取當前日期
set @CancelTime = CONVERT (time ,GETDATE (),108)--獲取當前時間
if @@ROWCOUNT >0 --受影響的行數
BEGIN
Insert into dbo.CancelCard (CardNUmber ,StuNumber ,Balance ,CancelTtime ,CancelDate )
values (@CardNumber ,@StuNumber ,@Balance ,@CancelTime ,@CancelDate )
delete from dbo.OnOffline where [email protected] ;
delete from dbo .Student where CardNum [email protected] ;
END
END
That's all and goodbye