2011-09-16 62 views
2

我的工作我的第一個真正的asp.net web應用程序,我種難倒最好的地方和方法來捕獲並處理數據庫約束違規。假設我對列有一個唯一的約束,並且用戶輸入了違反這個唯一約束的東西。我是否在業務層中通過調用數據庫來檢查該列存在的值,還是讓它一直到數據庫並讓它拋出異常並在我的應用程序中處理該異常?強制數據庫的約束在應用程序代碼

,因爲它是有道理的處理儘可能多的,你可以在業務層到達數據庫之前,我不喜歡後者的答案 - 。但是它也有點問題,因爲我的應用程序是由在所有表上執行基本CRUD操作的過程驅動的。因此,爲了讓我在業務層中實施唯一性,我需要爲每個可能的約束創建一個過程,以便在更新或插入之前查看。這似乎很單調乏味......而且我重複了數據庫和業務層中存在的業務規則,所以如果事情發生變化,不僅需要更改數據庫,還必須更改過程和應用代碼。

那麼,有沒有一個正確的方式或執行應用程序代碼,這些數據庫限制或我應該尋找一種方法來捕獲由數據庫拋出的異常,並在用戶友好的方式呈現出來的好辦法?

+0

感謝您的快速回復。這是有道理的,考慮到我不得不返回到數據庫來檢查唯一性。猜猜接下來要做的是弄清楚如何處理數據庫異常,並以一種用戶友好的方式呈現它們,並且不會向用戶公開太多信息。 – Pmosh

+0

關鍵是接受DBMS(順便說一下,不是「數據庫」)* IS *「業務層」的概念。谷歌爲Toon Koppelaars稱之爲「赫爾辛基宣言」。他有我見過的最好的解釋,爲什麼這是最好的選擇。 –

回答

2

後面的答案是正確的。如果您嘗試在您的前端應用程序中首先執行所有操作,那麼使用數據庫約束的目的是什麼?

約束的整個的一點是要有一致的方式的中心位置(DB服務器)處理儘可能多的數據驗證的可能,不管如何/當數據到達那裏。在前端應用程序中再次編寫相同的邏輯是多餘的,並且不必要的複雜。如果DB中的約束髮生了變化(應用程序認爲應該不再有效的東西)?無論如何,你會得到一個例外。

讓DB辦理驗證約束和處理代碼中的例外。由於DB處理數據,因此您可以使用所有方法訪問和更新數據以保持一致。如果更改了某些內容,則會使用新的約束更新數據庫,並且您的應用程序會自動同步。

0

我同意這是你如何使用數據庫後者給出你的描述。真正重要的是要意識到,即使您在業務層中進行調用以在進行更新/插入之前驗證每一個可能的約束衝突,數秒後,由於其他用戶的請求以及您的更新/插入仍然可能失敗。