簡體   English   中英

如何讓用戶手動輸入主鍵

[英]How to let the user to enter primary keys manually

我對我的ASP.NET網站有一個要求,該要求要求我讓用戶手動輸入特定表的主鍵,如果用戶輸入了數據庫中已經存在的主鍵,則系統應通知用戶“主要已經存在”或類似的東西。

我正在考慮讓用戶輸入主鍵,並且當他輸入已經存在的鍵時,系統將拋出違反主鍵約束的異常。 因此,我將捕獲該異常,並且在catch塊中,我將顯示一條錯誤消息,以通知用戶有關主鍵重復的信息。 但是,我不確定這是正確的方法還是有標准的方法?

是的,這是一種有效的方法。 但是,有幾件事需要提及:

  • 使用代理鍵 (計數器,GUID等)作為主鍵而不是用戶輸入的值(自然鍵)有很多優點,有關詳細信息,請參見鏈接的文章。 如果您已經考慮過這一點,並決定使用自然鍵,那很好,我認為應該提到它。 如果使用代理鍵,則可以通過唯一索引確保用戶定義值的唯一性。

  • 作為正常控制流的一部分,通常不贊成拋出異常:對現有鍵進行SELECT,然后INSERT會比等待異常發生更為優雅。 (使用事務和適當的事務隔離級別,以確保在SELECT和INSERT之間沒有其他客戶端可以插入任何行)。

在嘗試將新記錄插入數據庫之前,只需對目標表進行查詢以查看主鍵是否已經存在。 如果是這樣,則向用戶返回一條消息。

那太丑了。 在“常規”邏輯流中使用異常不是一個好主意-它使代碼更難以閱讀和維護,並且往往更慢(盡管您可能不會注意到性能影響)。

我將其拆分為“驗證”方法,該方法應驗證用戶輸入的數據-正確的數據類型嗎? 是否符合最小長度要求? 它獨特嗎?

如果“驗證”方法返回違規,則將其顯示給用戶。 給他們修復的機會。

如果“驗證”方法未返回違規,請嘗試插入記錄,並捕獲“重復鍵”異常(在驗證和輸入記錄之間,可能有人輸入了該記錄)。

我不會討論您是否應該這樣做(我不認為您應該:p),但這是代碼:

SET IDENTITY_INSERT TABLE ON

請記住,每個數據庫只能將一個表設置為ON

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

如果您能夠正確維護索引名稱,則可以將您的解決方案提議用於其他情況。

恕我直言,這種方法很好。 通常,替代方法是詢問數據庫中值的存在。 如果找到了,那最終也將導致異常。 如果您決定讓數據庫引發異常,請不要忘記在代碼文檔中提及它。 因為在沒有此類信息的情況下使用它可能會在將來引起一些問題。

為什么要打擾用戶以構成主鍵並猜測要輸入的內容以及是否已被使用呢? 我的意思是,我知道int是各種各樣的數字,但是用戶可能會嘗試使用3-4位數字; 最終,他們將開始擊球。 所以為什么?? 您不必要地使工作復雜化。

讓數據庫生成ID。 如有必要,向用戶報告。 再簡單不過了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM