1. 程式人生 > >機房重構之退卡——觸發器增強版

機房重構之退卡——觸發器增強版

 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