2011-02-02 192 views
1

我有一個SQL DB與各種表保存有關產品(這是一個網上商店)的信息,我用C#編碼。有一些選項與給定產品相關聯,並且如前所述,有關這些選項的信息在保存時分佈在幾張表格中。檢查項目是否存在保存

現在,當我在CMS中編輯本產品時,可以看到現有產品選項的列表,並且可以添加到該列表或從中刪除,就像您期望的那樣。

當我保存產品時,我需要檢查記錄是否已經存在,如果有,更新它,如果沒有,則保存新記錄。我試圖找到一個有效的方式來做到這一點。保持與產品選項相關的ID是非常重要的,因此每次清除它們並重新保存它們是不可行的。

再次描述,可能更清楚:想象一下,當我加載產品時,我有一個選項集合,這個選項被加載到內存中,並根據用戶的選擇加載/刪除。當他們點擊「保存」時,我需要檢查哪些選項是更新以及哪些是新的列表。

任何建議這樣做的有效方法?

謝謝。

回答

1

如果您希望實現的效率與數據庫的往返次數有關,那麼您可以編寫一個存儲過程來爲您執行更新或插入操作。

但是,在大多數情況下,如果您在表格上有適當的主鍵或唯一索引,則應該非常快速地避免SELECT首先出現。

如果效率是在服務器端優雅或減少代碼方面,那麼我會看看使用某種ORM,例如實體框架4.0。使用適當的ORM體系結構,您幾乎可以停止根據數據庫記錄和INSERT/UPDATE進行思考,只需處理內存中的對象集合即可。

0

運行選擇查詢檢查ID。如果它存在,那麼你需要更新。如果它不存在,那麼你需要插入。

沒有更多的細節我真的不知道還有什麼要告訴你。這是相當標準的。

+0

感謝您的反饋,對我來說,總是顯得乏味,當某些東西顯得乏味時,我傾向於認爲我錯過了一個更好的更有效的方式。很高興知道我不是,儘管這意味着它需要一段時間。 – scaryjones 2011-02-03 11:39:06

1

我通常這樣做是通過執行以下步驟:

  1. 對於每個項目,執行更新查詢,如果它存在,將更新的項目。
  2. 每次更新後,檢查更新了多少行(在SQL Server中使用@@ ROWCOUNT)。如果零行更新,則執行插入操作以創建該行。

或者,你可以做相反的,如果你創建一個唯一約束,以防止重複行:

  1. 對於每個項目,試圖將其插入。
  2. 如果插入由於約束而失敗(檢查錯誤代碼),請改爲執行更新。
+0

感謝您的反饋意見,對我來說,這似乎很乏味,當某些事情顯得單調乏味時,我傾向於認爲我錯過了一個更好的更有效的方式。很高興知道我不是,儘管這意味着它需要一段時間。 – scaryjones 2011-02-03 11:18:14

+0

如果您使用的是SQL Server,則可能需要使用MERGE命令。它可能會做你正在做的事情。但是,調試並不容易,這就是爲什麼我傾向於避免它。 – 2011-02-03 12:03:29