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,这样你就不会尝试追加已经存在的值 - 即,防止错误发生在第一个放置而不是依靠数据库引擎来拯救你。“
添加回答
举报