2012-01-31 164 views
1

我有我的ASP.NET網站的需求,這需要我讓用戶手動輸入特定表的主鍵,如果用戶輸入的主鍵是已經存在於數據庫中,系統應該通知用戶「Primary already exists」或類似的東西。如何讓用戶手動輸入主鍵

我想讓用戶輸入主鍵,當他輸入一個已存在的鍵時,系統將拋出主鍵約束違例的異常。因此,我將捕獲該異常,並在catch塊中顯示錯誤消息以通知用戶有關主鍵的重複。但是,我不確定這是否是正確的方式,或者是否有任何標準方法來執行此操作?

+0

爲什麼不先檢查鍵的存在,而不是試圖捕捉錯誤?這不像按主鍵查找單行會減慢應用程序的速度:) – 2012-01-31 14:41:11

+0

如何在用戶只輸入主鍵的情況下使用搜索功能,並返回查詢結果是否已經檢查存在? – DOK 2012-01-31 14:46:03

回答

5

是的,這是一種有效的方法。有跡象表明,應該提到的幾件事情,雖然:

  • 使用surrogate key(計數器,一個GUID,...)作爲主鍵,而不是用戶輸入的值(自然鍵)有很多優點,請參閱鏈接文章的細節。如果您已經考慮過這個問題並決定使用自然鍵,那很好,我只是認爲應該提及它。如果使用代理鍵,則可以通過唯一索引確保用戶定義值的唯一性。

  • 作爲正常控制流的一部分拋出異常通常會被忽視:對現有的鍵和INSERT執行SELECT操作將比等待異常發生更優雅。 (使用事務和相應的事務隔離級別來確保在您的SELECT和INSERT之間不會有其他客戶端可以插入行)。

+0

+1替代關鍵推薦 – Anastasiosyal 2012-01-31 14:45:37

1

在嘗試在數據庫中插入新記錄之前,只需對目標表執行查詢以查看主鍵是否已存在。如果確實如此,則向用戶返回消息。

1

這很醜陋。對於「正常」邏輯流使用異常並不是一個好主意 - 它使代碼更難讀取和維護,並且趨於更慢(儘管您可能不會注意到性能影響)。

我會把它分成一個「驗證」方法,它應該驗證用戶輸入的數據 - 它是正確的數據類型嗎?它是否符合最小長度要求?它是獨特的嗎?

如果「驗證」方法返回違規,請將其顯示給用戶;給他們修理它的機會。

如果「驗證」方法沒有返回違規,請嘗試插入記錄並捕獲「重複密鑰」異常(其他人可能在驗證和輸入記錄之間的時間內輸入了該記錄) 。

1

我不會討論是否應該或不應該這樣做(我不認爲你應該的方式:P),但是這是代碼:

SET IDENTITY_INSERT TABLE ON 

記住,你可以每個數據庫只有一個表設置爲ON

+1

僅當主鍵字段是IDENTITY字段時才需要。 – Heinzi 2012-01-31 14:47:49

+0

是真的,我認爲這是身份 – Diego 2012-01-31 14:57:17

1

MS Sql Server中的主鍵是唯一索引。在違反索引約束的情況下,數據庫將引發錯誤並回滾事務。

如果您能夠正確地維護索引名稱,您將能夠使用您提出的解決方案來處理其他情況。

恕我直言,這種做法很好。通常的替代方法是詢問數據庫中是否存在值。如果找到了,最終也會以異常結束。如果您決定讓db引發異常,請不要忘記在代碼的文檔中提及。因爲沒有這些信息的使用可能會導致未來的一些問題。

+0

我得到你的點Vash。我會發表評論,謝謝:) – Sas 2012-01-31 15:00:36

1

何苦與構成主鍵和猜測輸入什麼,以及是否它已經採取的用戶?我的意思是,我知道int是一個廣泛的數字,但用戶可能會嘗試3-4位數字;最終,他們會開始打Dupe。所以爲什麼??你不必要地複雜化。

讓db生成id。如有必要,請將其報告給用戶。不能更簡單。

+0

我也想這樣做,但用戶強迫我這樣做。我沒有選擇:( – Sas 2012-01-31 15:04:15

+0

那麼,那麼你的僱主在智力規模上缺乏幾點,在你想到的任何環境中,這個特定的要求是不合理的。如果你在填寫表格時已經指出了給用戶一個不確定的不便,你已經做好了自己的準備,讓smartass僱主稍後處理不方便的投訴,我敢打賭,錢將在未來討論可用性投訴時花費,他肯定會在某個時候從該表單中刪除該PK領域。 – 2012-01-31 17:54:21