5

我有一個Users表,它對用戶名有一個唯一約束(出於顯而易見的原因)。SQL唯一鍵插入

我使用的是EF 4.0 DAL來填充數據庫,並且在編碼CREATEUSER()方法的過程。

是...

  1. 最好能趕上SQLException如果我嘗試插入已經存在一個用戶名。
  2. 在我嘗試將其插入數據庫之前,請明確檢查用戶名?

如果你還可以給的理由,爲什麼,這將是偉大的!

回答

3

我會檢查記錄是否先存在。唯一的關鍵約束有助於防止應用程序首先允許「壞」數據通過的可能方式,但不是主要的阻止方式。在可以避免的情況下,將異常用作控制流機制(在這種情況下是驗證)通常是一個壞主意。

編輯:爲了避免混淆,我不是說沒有唯一索引的。它應該在那裏,但它不應該是檢查唯一性的主要手段。

+0

謝謝vcsjones。你有什麼聯繫,爲什麼將異常用作控制流機制是一個壞主意? – Darbio 2010-11-05 03:13:20

+0

當然,我會引用你到另一個SO討論:http://stackoverflow.com/questions/1336094/using-try-catch-for-flow-control-net我特別喜歡這個短語「例外情況是例外情況,不是爲了正常流動「在很多情況下,捕捉異常並不像意圖是清楚的。如果由於其他原因拋出異常呢?你會每次檢查異常和消息嗎?如果Microsoft在更高版本的SQL中更改異常消息會怎麼樣?良好的措施就可以了 – vcsjones 2010-11-05 03:19:20

+0

還有一個很好的討論:http://stackoverflow.com/questions/729379/why-not-use-exceptions-as-regular-flow-of-control – vcsjones 2010-11-05 03:25:14

2

我會說這是最好的處理例外。數據庫旨在處理用戶名的唯一性,所以我認爲它可以比你更有效地做到這一點。它還增加了系統的可移植性和內聚性。如果你在多個地方添加用戶,你將不得不復制用戶名檢查或創建一個方法,基本上你最終會重寫數據庫引擎已經寫入的內容。

+0

好點重新:重寫功能,但這是由DAL緩解,這意味着所有的用戶操作都會經歷這一點。 – Darbio 2010-11-05 03:12:46

+1

精心設計的架構不需要重複檢查。只需將邏輯放在它自己的類中,並在需要時使用該類。就是這樣,或者每次都抓住例外。理想情況下,應用程序中只有一個CreateUser。 – vcsjones 2010-11-05 03:22:09

+0

正確 - 在需要它的webservices使用的DAL中創建一個CreateUser。 – Darbio 2010-11-05 03:36:02

0

我第二什麼塞繆爾說。最有效的方法是將其留給數據庫。所有其他選項都比較耗費時間和資源....

1

此外什麼撒母耳說,你需要確保沒有人進入,可能你的檢查和添加記錄到數據庫之間與你衝突的記錄。你可以通過一個鎖來實現這一點,但是你必須捕獲由鎖造成的異常。

至於複製業務規則和數據庫中的東西,我贊成數據庫儘可能多地依照需要進行檢查,即使這在業務層中重複了一些東西。數據庫鎖定得越緊密就越能抵抗無效數據。它可以防止您通過應用程序之外的其他工具訪問數據庫,例如支持人員使用SSMS對數據庫進行更改以糾正用戶報告的數據問題。

+0

非常好的一點! – Samuel 2010-11-05 12:25:36