Slick theme的作者又有新的作品出爐了!
http://go.mobihand.com/?op=dlm&pd=28624&l=1&ps=150&ext=jad
使用storm的風格,桌布是皮格感覺的rim logo,按鈕跟文字顯示上都很讚哦!
另外有一款相同風格的today theme也提供下載。
http://go.mobihand.com/?op=dlm&pd=28623&l=1&ps=150&ext=jad
發送自我的BlackBerry®智慧型手機。
2009/04/30
2009/04/03
Trigger Error Handling For ASP
最近遇到一個情況,在A資料表內有不同的trigger,其中有個trigger 1的作法是在update數量時要去同時update另一個B資料表的數量,
而這個A資料表的另一個trigger 2也會被執行,如果這時trigger 1內的另一個C資料內的Constraint裡觸發時,ASP的ADO會誤以為Trigger 2執行成功,
而不會返回錯誤,以致於程式裡無法作error handling
此時的解法就只能去調整trigger的執行順序,讓有Constraint的Trigger能先被執行,這樣才能抓到錯誤。
以下是範例示範:
當我執行以下程式時,觸發MyStock的Constraint :
結果:
(1 個資料列受到影響)
訊息 547,層級 16,狀態 0,程序 TRI_UpdateDetails,行 29
UPDATE 陳述式與 CHECK 條件約束 "CK_MyProduct_Qty_Selling" 衝突。衝突發生在資料庫 "JesseWangDB",資料表 "dbo.MyProduct"。
陳述式已經結束。
因為TRI_InsertLog先被執行到了,所以ASP的ADO誤以為執行結果無誤。
所以我們要調整Trigger順序
調整後的結果:
訊息 547,層級 16,狀態 0,程序 TRI_UpdateDetails,行 29
UPDATE 陳述式與 CHECK 條件約束 "CK_MyProduct_Qty_Selling" 衝突。衝突發生在資料庫 "JesseWangDB",資料表 "dbo.MyProduct"。
陳述式已經結束。
這樣ASP的ADO就可以抓到error了。
而這個A資料表的另一個trigger 2也會被執行,如果這時trigger 1內的另一個C資料內的Constraint裡觸發時,ASP的ADO會誤以為Trigger 2執行成功,
而不會返回錯誤,以致於程式裡無法作error handling
此時的解法就只能去調整trigger的執行順序,讓有Constraint的Trigger能先被執行,這樣才能抓到錯誤。
以下是範例示範:
-- 1. Constraint : CK_MyProduct_Qty_Selling
ALTER TABLE [dbo].[MyProduct] WITH NOCHECK ADD CONSTRAINT [CK_MyProduct_Qty_Selling]
CHECK (([MyProductQty]-[MyProductQtySelling])>=(0) AND [MyProductQty]>(0))
GO
ALTER TABLE [dbo].[MyProduct] CHECK CONSTRAINT [CK_MyProduct_Qty_Selling]
-- 2. Trigger : InsertLog
CREATE TRIGGER [dbo].[TRI_InsertLog]
ON [dbo].[JesseWangDB]
FOR UPDATE
AS
BEGIN
IF UPDATE (Product_Qty)
BEGIN
INSERT MyLog .....
END
END
GO
-- 3. Trigger : UpdateDetails
CREATE TRIGGER [dbo].[TRI_UpdateDetails]
ON [dbo].[JesseWangDB]
FOR UPDATE
AS
DECLARE @OldProductId int
BEGIN
IF UPDATE (Product_QtySelling)
BEGIN
SELECT @OldProductId=ProductId FROM deleted
UPDATE MyStock
SET MyStockQty = MyStockQty + 1
WHERE MyStockProductId = @OldProductId
END
END
GO
當我執行以下程式時,觸發MyStock的Constraint :
UPDATE MyProduct SET MyProductQtySelling = MyProductQtySelling + 1 WHERE MyProductId = 38382
結果:
(1 個資料列受到影響)
訊息 547,層級 16,狀態 0,程序 TRI_UpdateDetails,行 29
UPDATE 陳述式與 CHECK 條件約束 "CK_MyProduct_Qty_Selling" 衝突。衝突發生在資料庫 "JesseWangDB",資料表 "dbo.MyProduct"。
陳述式已經結束。
因為TRI_InsertLog先被執行到了,所以ASP的ADO誤以為執行結果無誤。
所以我們要調整Trigger順序
EXEC sp_settriggerorder @triggername=N'[dbo].[TRI_UpdateDetails]', @order=N'First', @stmttype=N'UPDATE'
調整後的結果:
訊息 547,層級 16,狀態 0,程序 TRI_UpdateDetails,行 29
UPDATE 陳述式與 CHECK 條件約束 "CK_MyProduct_Qty_Selling" 衝突。衝突發生在資料庫 "JesseWangDB",資料表 "dbo.MyProduct"。
陳述式已經結束。
這樣ASP的ADO就可以抓到error了。
訂閱:
文章 (Atom)
-
一個糖果有一個糖果紙 一個糖果1元 現在商店在作促銷 3個糖果紙可以換1個糖果 請問 15元最多可以吃幾個糖果?
-
簡單整理一下今天看到的這篇文章, 未來可以用指標來改善團隊狀況。 ----- 軟體工程的重要的指標 DORA 指標 (DevOps Research Assessment) 1. 部署頻率: 產品多快發佈出去 2. 投入到交貨的時間 (Lead-Time For Ch...
-
在預設的情況下,中文的SQL Server的定序設定為Chinese_Taiwan_Stroke_CI_AS, 會把全形及半形視為相同字元,這會影響到我們在SUBSTRING及CARINDEX上的判斷,如果字串內同時有全形及半形的符號,SQL Server皆會把它視為相同的符號....