3 回答

TA貢獻1848條經驗 獲得超6個贊
我通常首先運行insert語句然后檢查是否發生了錯誤3022,這表明該行已經存在。所以像這樣:
On Error Resume Next CurrentDb.Execute "INSERT INTO Table1 (Fields) VALUES (Data)", dbFailOnErrorIf Err.Number = 3022 Then Err.Clear CurrentDb.Execute "UPDATE Table1 SET (Fields = Values) WHERE Column1 = 'SomeValue'", dbFailOnError ElseIf Err.Number <> 0 Then 'Handle the error here Err.ClearEnd If
編輯1:
我想提一下,我在這里發布的是一個非常常見的解決方案但你應該意識到,計劃錯誤并將它們作為程序正常流程的一部分通常被認為是一個壞主意,特別是如果有的話其他方法可以達到相同的效果。感謝RolandTumble指出這一點。

TA貢獻1895條經驗 獲得超7個贊
假設Column1上有唯一索引,您可以使用DCount
表達式來確定您是否有零行或一行,其中Column1 ='SomeValue'。然后INSERT
或UPDATE
基于該計數。
If DCount("*", "Table1", "Column1 = 'SomeValue'") = 0 Then Debug.Print "do INSERT"Else Debug.Print "do UPDATE"End If
我更喜歡這種方法,首先嘗試INSERT
捕獲3022密鑰違規錯誤,然后執行UPDATE
響應錯誤。但是我無法從我的方法中獲得巨大的利益。如果您的表包含自動編號字段,則避免失敗INSERT
將阻止您不必要地消耗下一個自動編號值。我還可以避免INSERT
在不需要時構建字符串。Access Cookbook告訴我字符串連接在VBA中是一個中等昂貴的操作,所以我尋找機會避免構建字符串,除非實際需要它們。這種方法也可以避免為不需要的人創建一個鎖INSERT
。
但是,這些原因中沒有一個對您來說非常有吸引力。老實說,我認為我在這種情況下的偏好可能與我的“感覺正確”有關。我同意@ David-W-Fenton對前一個Stack Overflow問題的評論:“最好編寫你的SQL,這樣你就不會嘗試追加已經存在的值 - 即,防止錯誤發生在第一個放置而不是依靠數據庫引擎來拯救你?!?/em>
添加回答
舉報