2012-10-07 72 views
0

我有一個asp.net Gridview處理插入操作到SQL數據庫中。只有滿足唯一性標準才允許插入記錄,並且使用SQL服務器中的唯一索引強制執行此限制。如果用戶嘗試插入已存在的記錄,則會顯示錯誤消息。SQL:如果不存在記錄插入記錄的最佳做法

我想知道什麼是實施這一最佳做法。

  1. 檢查記錄是否存在SQL端,使用IF EXISTS和鎖定提示(updlock,holdlock等)。根據是否插入記錄,將錯誤代碼返回到ASP.net
  2. 在SQL服務器try/catch塊內執行INSERT操作,依靠唯一索引來防止在記錄存在時發生插入。根據是否引發異常返回錯誤代碼。
  3. 執行INSERT操作SQL方面,但沒有SQL try/catch。相反,在ASP.net中處理PK違例異常。

通常情況下,我會考慮使用異常來處理有效的操作是不好的做法 - 即軟件不應該拋出異常,除非出現問題。但是,如果SQL中的表上的唯一索引要實現所需的約束,爲什麼還要執行手動檢查記錄的存在?

+0

MERGE在我使用的SQL版本(2005)中不可用,並且我不想更新記錄(如果它已經存在)。如果記錄存在,則會向用戶顯示通知 – Trent

+0

如果您的禁用密鑰選項1有索引,則可能是無此例外且速度最快的最佳方式。 – YvesR

+0

你可以把你的IF EXISTS邏輯放在INSTEAD OF TRIGGER中,並檢查存在與否。你也可以把你的proc做IF EXISTS邏輯,讓INSTEAD OF TRIGGER自動爲你調用。好處是所有嘗試插入的應用程序邏輯都會爲他們設置適當的位置,這樣您就可以一次完成更改並在全球範圍內強制執行。 – Kuberchaun

回答

0

我會做一個單獨的調用來檢查記錄是否已經存在。如果是,則向用戶顯示消息,如果沒有插入。我這樣做的原因是因爲我更喜歡在應用程序中保留所有業務邏輯。

如果你在做只有一個存儲過程調用堅持:

我會檢查我插入之前。我還會將一個輸出參數添加到存儲過程中,如果插入失敗,它將返回一條消息。在我的應用程序中,如果我在輸出參數中看到一條消息,我會將其顯示給用戶。

相關問題