用SQL Server資料庫處理資料層錯誤

iDotNetSpace發表於2008-07-03

開發人員在努力做到妥善地處理意外,這樣使用者就不用擔心天書般的系統錯誤資訊。出於這個原因,異常處理是每個.net應用程式的一個標準部分。Try/catch塊讓你能夠捕捉異常並從該點控制應用程式的執行。與資料庫進行互動操作的時候會發生很多錯誤,但是很多開發人員都不知道如何處理資料庫層的錯誤。本週我們將探討如何利用SQLServer和T-SQL來處理你資料庫程式碼裡的錯誤。

處理T-SQL裡的錯誤

SQLServer的SQL對話讓你能夠輕鬆地處理可能會在儲存程式、函式裡發生的非致命錯誤,但是並不是所有的錯誤都很容易處理。事實上,致命和非致命的錯誤有很多。什麼是致命的,什麼是非致命的,對此沒有很完備的文件說明,但是你的應用程式程式碼總是可以利用try/catch塊來處理致命的資料庫錯誤。對於其他所有的錯誤,你可以使用下面的技術。

事務

你應該在資料庫程式碼裡使用事務,以確保在一切都沒有問題的時候所有的更改都被完成。SQLServer的線上幫助將事務描述為任務的一個邏輯單元,它由一系列語句(選擇、插入、更新,或者刪除等)組成。如果在事務期間沒有發生任何錯誤,那麼對事務的所有改動都會成為資料庫的永久部分。如果在這期間發生了錯誤,不會對資料庫進行任何修改。

事務包含在BEGIN TRANSACTION和END TRANSACTION語句之間。ROLLBACK TRANSACTION語句可以取消所有的更改,因此不會發生任何變化。用COMMIT TRANSACTION語句可以進行永久的更改。現在,就讓我們把注意力放在如何處理T-SQL裡的錯誤上。

@@Error

@@Error函式讓你可以實現T-SQL錯誤處理。它會返回由系統所返回的錯誤程式碼。如果沒有錯誤發生就會返回“0”。@@Error函式必須緊接在一個語句之後立即被呼叫,因為它會在每個T-SQL語句之後被清除。

RAISERROR

RAISERROR語句讓你能夠生成一個自定義的錯誤資訊或者使用一個放在sysmessages表格裡的已有訊息。你可以線上檢視它的句法,但是它的最基本格式包括了訊息(用於自定義的訊息)或者訊息id(用於已有的訊息)和它的嚴重度及狀態。SQLServer沒有使用狀態,所以隨便傳遞給它一個數字就可以了。嚴重度表示了錯誤的嚴重程度,0-18供使用者使用,而19-25保留給管理員使用。

下面的示例儲存過程使用了這些特性來更新示例Northwind資料庫裡的一條記錄:

CREATE PROCEDURE sp_UpdateCustomERPhone(
@id nvarchar(5),
@phone nvarchar(24),
@retvalueint output
) AS
BEGIN
BEGIN TRANSACTION
UPDATE [dbo].[Customers] SET [Phone] = @phone WHERE([CustomerID] = @id)
IF (@@ERROR <> 0) -- a non-negative value signals an error
BEGIN
ROLLBACK TRANSACTION -- changes are not permanent
RAISERROR("Update Customers Error",1,1) -- raise a custom error message
-- Custom error message appears if run from console
SET @retvalue = -1 -- return negative value to signalproblems
END
COMMIT TRANSACTION -- make the changes permanent, so record is updated
SET @retvalue = 1 -- a positive return value signalssuccess
RETURN
END

如果沒有錯誤發生,它就把電話號碼列設定為一個值,傳遞給過程。它使用一個返回值引數,如果有問題發生它就返回一個負值,如果用所有的東西都執行沒有問題,它會返回一個正值。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-369050/,如需轉載,請註明出處,否則將追究法律責任。

相關文章