3 回答

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超6個(gè)贊
我通常首先運(yùn)行insert語(yǔ)句然后檢查是否發(fā)生了錯(cuò)誤3022,這表明該行已經(jīng)存在。所以像這樣:
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:
我想提一下,我在這里發(fā)布的是一個(gè)非常常見(jiàn)的解決方案但你應(yīng)該意識(shí)到,計(jì)劃錯(cuò)誤并將它們作為程序正常流程的一部分通常被認(rèn)為是一個(gè)壞主意,特別是如果有的話其他方法可以達(dá)到相同的效果。感謝RolandTumble指出這一點(diǎn)。

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