2009-11-03 88 views
1

刷新後是否有更簡單的方法來防止重複插入?我現在的做法是選擇除ID之外的所有字段作爲參數;如果存在我不插入的記錄。有沒有辦法檢測刷新?檢測重複插入

回答

1

我想你可能想要EXISTS功能。 下面是我通過google找到的EXISTS的簡單解釋。

+0

我喜歡這種方式。但是,如果我比較空值呢?因爲我會說= null,沒有東西可以= null,但它可以是isNull。 – Eric 2009-11-04 14:54:10

+0

你可以嘗試在可能爲空的字段中添加一些類似於「IS NOT NULL」的查詢。很難確定沒有看到查詢的例子。 – ChadNC 2009-11-04 20:01:22

4

假設它是一個數據庫,您可以對「除ID以外的所有字段」的組合添加一個唯一約束,並在插入或更新時捕獲異常。

+0

我很喜歡這個。首先我會明天早上去嘗試。 – Eric 2009-11-03 22:55:25

+0

這裏的同事太害怕嘗試這一個。他們不喜歡篡改數據庫。 – Eric 2009-11-04 15:11:42

+0

你也可以在你的DataSet上加一個* Key *來做到這一點。 – 2009-11-04 19:42:44

0

你使用了哪些數據庫?如果它是MySQL,並且您的實施的某些其他因素保持一致,則始終可以使用INSERT IGNORE INTO ...編輯:觸擊SQL Server

或者,您可以創建「處理程序」頁面,例如,你的過程是這樣的:

  1. 用戶試圖執行「行動」
  2. 用戶發送到「doAction.xxx」
  3. 「doAction.xxx」完成,並重定向到「actionDone.xxx」
  4. ???
  5. 利潤!

編輯:重新讀你的問題後,我要更傾向於第二種解決方案;通過使用重定向創建中間頁面(通常是HTTP/1.1 303 See Other),通常可以防止這種混淆。在數據庫中檢查唯一標識符總是一個好主意,但對於不希望刷新重複最後一個操作的簡單情況,這是一個優雅且完善的解決方案。

+0

我使用sql server – Eric 2009-11-04 14:08:02

3

我同意@Austin Salonen,您應該首先保護具有主鍵,唯一約束和外鍵的數據庫。

這樣做,許多網站將包括一些JS提交按鈕後立即禁用按鈕發送請求之前。這樣,雙擊的用戶不會發送兩個請求。

+1

JS技巧非常適合減少服務器的負載,但它不會保護你。關掉JS甚至惡意提交多個請求的用戶呢? – rmeador 2009-11-03 22:37:08

+0

@rmeador - 同意。沒有數據庫保護,沒有真正的解決方案。 JS技術只能被認爲是方便用戶使用的。 – 2009-11-03 22:56:52

0

我提出了在提交請求(插入到數據庫中的記錄)後將用戶重定向到另一個(確認)頁面的選項。這樣他們將無法刷新。

你也可以有一個標誌,指示插入請求是否已經提交,它要麼存放的頁面(使用JavaScript),或在會議上。您也可以進一步將其存儲在其他地方,但這是您的Web應用程序的架構決定。

如果您正在使用AJAX請求中插入一條記錄,然後這是一個有點很難防止這種在客戶端。

我寧願做一個指標/標誌,然後比較字段。這當然取決於你的記錄。例如,如果它是一個簡單的商店,並且用戶想要做出相同的訂單,那麼您會將其視爲重複的訂單並有效地阻止該功能。

1

Dereleased說,使用基於303重定向。使表單提交使用POST,然後保存後,它發送一個303標題,並通過位置標題將它們發送到提交後的URL,該標題將通過GET獲取,刷新不會重新發布數據。

1

自從我做了任何真正的網絡工作已經很長時間了。但回到1.1天后,我記得使用與回傳相關聯的ID來確定刷新是否發生。

快速搜索後,我覺得這是我根據我的解決方案從文章:

http://msdn.microsoft.com/en-us/library/ms379557(VS.80).aspx

它基本上展示瞭如何建立一個新的頁面類,你可以繼承。當你正在做一些不應該在刷新時重複的事情時,基類將公開一個你調用的方法,以及一個IsPageRefresh方法來跟蹤是否發生刷新。

這篇文章是許多類似目標變化的基礎,所以它應該是一個很好的開始。不幸的是我不記得它是如何真的給予更多的幫助。